我在前面提出了一个类似的问题,但我没有使用Groovy/Java8regex/regex/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字符串显然有一个反勾号,这是在regex中定义的。我是不是不正确地使用matcher.matches()?
最后,我希望下列字符被视为“非法”:
`/;[]&<>?:()\x{e76f}
但是上面的代码对于所有的input排列似乎都失败了,不管我“切换”了哪一个(而不是注释掉)。有什么想法吗?
发布于 2016-05-10 21:51:07
在使用Matcher.matches()时,整个输入必须“匹配”正则表达式,因此必须将正则表达式更改为/.*[`\/;\[\]&<>?:\()|-].*/。
或者,要用=~创建Matcher对象,然后使用它的方法,也可以简单地使用==~ matches操作符。(if (input ==~ illNameChars) ...)。
或者,您也可以在用if (matcher) ...创建它之后执行=~。
最后一种选择是保持正则表达式的原样,但是使用if (matcher.find()) ...代替,因为find()检查正则表达式是否匹配输入字符串的任何子字符串。
发布于 2016-05-10 20:25:21
与Java一样,.matches()方法仅在整个输入字符串与regex匹配时才返回True。
由于您已经使用=~运算符来创建matcher对象,所以只需测试if matcher (如在医生里所示)。
https://stackoverflow.com/questions/37148100
复制相似问题