Java 如何检查正正则表达式匹配的后续附加是否必须将其转换为负匹配?
我开发了一个类,该类应该扩展Java 如何检查正正则表达式匹配的后续附加是否必须将其转换为负匹配?,java,regex,Java,Regex,我开发了一个类,该类应该扩展javafx.scene.control.TextField,并且应该根据任意正则表达式验证输入。 要实现的下一个特性是,如果在不提供无效输入的情况下,无法向实际输入中添加其他输入,则文本字段应将焦点切换到下一个控制元素 对我来说,这归结为: 我有一个名为a的字符串。 我有一个正则表达式p。 我应该找出是否有一个字符c,这样p(a+c)是真的,假设p(a)是真的 我发现了java.util.regex.Matcher方法的前导,但该方法只告诉我是否存在字符c,因此假设
javafx.scene.control.TextField
,并且应该根据任意正则表达式验证输入。
要实现的下一个特性是,如果在不提供无效输入的情况下,无法向实际输入中添加其他输入,则文本字段应将焦点切换到下一个控制元素
对我来说,这归结为:
我有一个名为a
的字符串。
我有一个正则表达式p
。
我应该找出是否有一个字符c
,这样p(a+c)
是真的,假设p(a)
是真的
我发现了java.util.regex.Matcher
方法的前导,但该方法只告诉我是否存在字符c
,因此假设p(a)
为真,则p(a)
为假
我的下一个方法是简单地循环所有字符,附加它们,并使用Matcher.hitEnd
测试部分匹配。这是可行的,但每次需要测试110万个字符才能符合unicode标准
因此,我正在寻找一种有效的方法来实现以下(缩短的)类:
公共类高级匹配器{
模式p;
匹配器m;
字符串actInput;/**<实际输入字符串*/
静态最终int MAX_UNICODE=0x10FFFF;
公共高级匹配器(字符串regexp){
p=Pattern.compile(regexp);
m=p.matcher(“”);
}
公共无效重置(字符串输入){
m、 复位(输入);
输入=输入;
}
/**
*此方法应检查实际输入是否与正则表达式正匹配
*如果不改变正匹配,任何字符都不能附加到实际输入中
*变成一个负匹配。
*
*如果实际输入与此实例的正则表达式不匹配,则此
*方法应返回false。
*
*否则,如果找到可以附加到正则表达式的字符,则返回false
*表达式,而不将其转换为负匹配。
*
*@return false,如果实际输入为负匹配,或者如果额外的{@link Character}
*存在不会将其转换为负匹配的。
*/
公共布尔Required(){
//需要说明的是,“return m.requireEnd();”并不能解决这个问题
如果(!m.matches())
返回false;
对于(int i=0;我会检查是否有n个字符破坏了匹配比检查最后n个字符是否破坏了匹配效率低得多。我是否遗漏了什么?这也假设输入有一个最大长度,并且实际输入并不重要,只是它是否以某种格式。这对应用程序没有多大意义,不是吗hat接受输入。@Helen我如何获取子模式来检查最后的n
字符是否破坏了字符串的第一个actInput.length()-n
字符未使用的子模式?如果我有模式“[0-9]{4}”和字符串“123”,我需要获取子模式“[0-9]{1}”对于额外的检查,但对于任意的regexp,我认为这远远超出了琐碎的范围。这是不可能的,因为任意模式意味着模式可能包含任何条件(一个无限多的集合),因此无法预测当p(a)
为真时p(a+c)
也为真(除非您测试了所有可能的c。)例如,考虑一个简单的前瞻,如(?!*a)
检查是否有n个字符破坏匹配比检查最后n个字符是否破坏匹配效率要低得多。我是否遗漏了什么?此外,这还假设输入有一个最大长度,并且实际输入并不重要,只是它是否为特定格式。这对于使用获取输入。@Helen我如何获取子模式来检查最后的n
字符是否破坏了字符串的第一个actInput.length()-n
字符未使用的子模式?如果我有模式“[0-9]{4}”和字符串“123”,我需要获取子模式“[0-9]{1}”对于额外的检查,但对于任意的regexp,我认为这远远超出了琐碎的范围。这是不可能的,因为任意模式意味着模式可能包含任何条件(一个无限多的集合),因此无法预测当p(a)
为真时p(a+c)
也为真(除非您测试了所有可能的c。)例如,考虑一个简单的前瞻,如(?!*a)
public class AdvancedMatcher{
Pattern p;
Matcher m;
String actInput; /**< The actual input string */
static final int MAX_UNICODE=0x10FFFF;
public AdvancedMatcher(String regexp){
p = Pattern.compile(regexp);
m = p.matcher("");
}
public void reset(String input) {
m.reset(input);
actInput=input;
}
/**
* This method should check if the actual input is a positive match to the regular expression
* and no character could be appended to the actual input without turning the positive match
* into a negative match.
*
* If the actual input is not a match to the regular expression of this instance this
* method should return false.
*
* Otherwise false is returned if a character is found that could be appended to the regular
* expression without turning it into a negative match.
*
* @return false if actual input is a negative match or if an additional {@link Character}
* exists that would not turn it into a negative match.
*/
public boolean requireEnd() {
//To be clear, "return m.requireEnd();" does not solve this problem
if(!m.matches())
return false;
for(int i=0;i<MAX_UNICODE;++i) {
Matcher tmpM=p.matcher(actInput+String.valueOf(Character.toChars(i)));
if(tmpM.matches() || tmpM.hitEnd())
return false;
}
return true;
}
}