All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.text.finder.PatternFinder Maven / Gradle / Ivy

Go to download

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

There is a newer version: 5.8.34
Show newest version
package cn.hutool.core.text.finder;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则查找器
* 通过传入正则表达式,查找指定字符串中匹配正则的开始和结束位置 * * @author looly * @since 5.7.14 */ public class PatternFinder extends TextFinder { private static final long serialVersionUID = 1L; private final Pattern pattern; private Matcher matcher; /** * 构造 * * @param regex 被查找的正则表达式 * @param caseInsensitive 是否忽略大小写 */ public PatternFinder(String regex, boolean caseInsensitive) { this(Pattern.compile(regex, caseInsensitive ? Pattern.CASE_INSENSITIVE : 0)); } /** * 构造 * * @param pattern 被查找的正则{@link Pattern} */ public PatternFinder(Pattern pattern) { this.pattern = pattern; } @Override public TextFinder setText(CharSequence text) { this.matcher = pattern.matcher(text); return super.setText(text); } @Override public TextFinder setNegative(boolean negative) { throw new UnsupportedOperationException("Negative is invalid for Pattern!"); } @Override public int start(int from) { if (matcher.find(from)) { final int end = matcher.end(); // 只有匹配到的字符串结尾在limit范围内,才算找到 if(end <= getValidEndIndex()){ final int start = matcher.start(); if(start == end){ // issue#3421,如果匹配空串,按照未匹配对待,避免死循环 return INDEX_NOT_FOUND; } return start; } } return INDEX_NOT_FOUND; } @Override public int end(int start) { final int end = matcher.end(); final int limit; if(endIndex < 0){ limit = text.length(); }else{ limit = Math.min(endIndex, text.length()); } return end <= limit ? end : INDEX_NOT_FOUND; } @Override public PatternFinder reset() { this.matcher.reset(); return this; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy