Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查正正则表达式匹配的后续附加是否必须将其转换为负匹配?_Java_Regex - Fatal编程技术网

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;
        }
    }