Groovy matcher.matches似乎不适用于有效的正则表达式



我之前问过类似的问题,但我没有使用Groovy/Java 8 regex/pattern/matcher API的不同部分。

Groovy 2.4在这里:

class TestPatterns {
    static void main(String[] args) {
        Matcher matcher
        String illNameChars = /[`/;[]&<>?:()|-]+/
        String input = "Bupo`dupo"
//        String input = "Bupo/dupo"
//        String input = "Bupo;dupo"
//        String input = "Bupo[dupo"
//        String input = "Bupo]dupo"
//        String input = "Bupo&dupo"
//        String input = "Bupo<dupo"
//        String input = "Bupo>dupo"
//        String input = "Bupo?dupo"
//        String input = "Bupo:dupo"
//        String input = "Bupo\dupo"
//        String input = "Bupo(dupo"
//        String input = "Bupo)dupo"
//        String input = "Bupo|dupo"
//        String input = "Bupo-dupo"
        if(input) {
            matcher = input =~ illNameChars
            if(matcher.matches()) {
                println "Illegal character detected!"
            } else {
                println "The input is perfectly legal."
            }
        }
    }
}

为什么这会打印出"输入完全合法。"?input字符串中显然有一个backtick,这是在正则表达式中定义的。我是否错误地使用了matcher.matches()

最终,我希望以下字符被视为"非法":

`/;[]&lt;>?:()|-

但上面的代码似乎对所有的input排列都失败了,无论我"切换"了哪一个(没有注释掉)。有什么想法吗?

使用Matcher.matches()时,整个输入必须"匹配"正则表达式,因此必须将正则表达式更改为/.*[`/;[]&<>?:()|-].*/

除了使用=~创建Matcher对象然后使用其方法之外,您还可以简单地使用==~ matches运算符。(if (input ==~ illNameChars) ...)。

或者,您也可以在使用=~创建if (matcher) ...之后执行它。

最后一种选择是保持正则表达式的原样,但使用if (matcher.find()) ...,因为find()会检查正则表达式是否与输入字符串的任何子字符串匹配。

在Java中,.matches()方法只有在整个输入字符串与正则表达式匹配时才返回True

由于您已经使用了=~运算符来创建匹配器对象,因此只需测试if matcher即可(如文档中所示)。

相关内容

最新更新