我之前问过类似的问题,但我没有使用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()
?
最终,我希望以下字符被视为"非法":
`/;[]<;>?:()|-
但上面的代码似乎对所有的input
排列都失败了,无论我"切换"了哪一个(没有注释掉)。有什么想法吗?
使用Matcher.matches()
时,整个输入必须"匹配"正则表达式,因此必须将正则表达式更改为/.*[`/;[]&<>?:()|-].*/
。
除了使用=~
创建Matcher对象然后使用其方法之外,您还可以简单地使用==~
matches运算符。(if (input ==~ illNameChars) ...
)。
或者,您也可以在使用=~
创建if (matcher) ...
之后执行它。
最后一种选择是保持正则表达式的原样,但使用if (matcher.find()) ...
,因为find()
会检查正则表达式是否与输入字符串的任何子字符串匹配。
在Java中,.matches()
方法只有在整个输入字符串与正则表达式匹配时才返回True
。
由于您已经使用了=~
运算符来创建匹配器对象,因此只需测试if matcher
即可(如文档中所示)。