这是一个棘手的问题,也许最终它没有解决方案(或者至少不是一个合理的解决方案)。我想要一个特定于 Java 的示例,但如果可以完成,我想我可以用任何示例来完成。
我的目标是找到一种方法来了解从输入流中读取的字符串是否仍然可以匹配给定的正则表达式模式。或者,换句话说,读取流直到我们得到一个绝对不匹配这种模式的字符串,无论你添加多少字符。
实现这一点的极简主义简单方法的声明可能是这样的:
boolean couldMatch(CharSequence charsSoFar, Pattern pattern);
这种方法会返回true的情况下charsSoFar,如果增加了新的人物还是能模式,或者false如果它有一点机会都没有与之相匹配的,甚至增加新的人物。
举一个更具体的例子,假设我们有一个像"^([+-]?\\d*\\.?\\d*)$".
使用这样的模式,couldMatch将返回true以下示例charsSoFar参数:
"+"
"-"
"123"
".24"
"-1.04"
依此类推,因为您可以继续为所有这些添加数字,并在前三个数字中添加一个点。
另一方面,从前一个派生的所有这些示例都应该返回false:
"+A"
"-B"
"123z"
".24."
"-1.04+"
乍一看很明显,无论您添加多少字符,这些都永远不会符合上述模式。
编辑:
我现在添加我当前的非正则表达式方法,以便使事情更清楚。
首先,我声明了以下功能接口:
public interface Matcher {
/**
* It will return the matching part of "source" if any.
*
* @param source
* @return
*/
CharSequence match(CharSequence source);
}
然后,之前的函数将被重新定义为:
boolean couldMatch(CharSequence charsSoFar, Matcher matcher);
浮点数的(起草的)匹配器可能看起来像(注意这在开始时不支持 + 号,只支持 -):
public class FloatMatcher implements Matcher {
@Override
public CharSequence match(CharSequence source) {
StringBuilder rtn = new StringBuilder();
if (source.length() == 0)
return "";
if ("0123456789-.".indexOf(source.charAt(0)) != -1 ) {
rtn.append(source.charAt(0));
}
boolean gotDot = false;
for (int i = 1; i < source.length(); i++) {
if (gotDot) {
if ("0123456789".indexOf(source.charAt(i)) != -1) {
rtn.append(source.charAt(i));
} else
return rtn.toString();
} else if (".0123456789".indexOf(source.charAt(i)) != -1) {
rtn.append(source.charAt(i));
if (source.charAt(i) == '.')
gotDot = true;
} else {
return rtn.toString();
}
}
return rtn.toString();
}
}
在 canMatch 方法的省略体中,它只会迭代调用 matcher.match() 并在源参数的末尾添加一个新字符,并在返回的 CharSequence 等于源参数时返回 true,并在返回时立即返回 false它是不同的(意味着添加的最后一个字符破坏了匹配)。
慕村225694
沧海一幻觉
相关分类