我之前问过类似的问题,但我没有使用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; (没有注释掉)。有什么想法吗?
答案 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所示)。