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

时间:2016-05-10 20:13:52

标签: regex groovy

我之前问过类似的问题,但我没有使用Groovy / Java 8正则表达式/模式/匹配器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."
            }
        }
    }
}

为什么打印出来&#34; 输入完全合法。&#34;? input字符串显然有一个反引号,这在正则表达式中定义。我错误地使用matcher.matches()吗?

最终,我希望将以下字符视为&#34;非法&#34;:

  

`/; []&安培;&LT;&GT; :()| -

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

2 个答案:

答案 0 :(得分:2)

使用Matcher.matches()时,整个输入必须&#34;匹配&#34;正则表达式,所以你必须将你的正则表达式改为/.*[`\/;\[\]&<>?:\()|-].*/

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

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

你拥有的最后一个选择是保持你的正则表达式,但是使用if (matcher.find()) ...代替,find()检查正则表达式是否匹配输入字符串的任何子字符串。

答案 1 :(得分:0)

与在Java中一样,如果整个输入字符串与正则表达式匹配,则.matches()方法仅返回True

由于您已使用=~运算符创建匹配器对象,因此只需测试if matcher(如图in the docs所示)。