我有以下方法来检查允许的字符:
private boolean checkIfAllCharsAreValid(String test) {
boolean valid = false;
if (test.matches("^[a-zA-Z0-9,.;:-_'\\s]+$")) {
valid = true;
}
return valid;
}
但如果test中包含字符-
,则匹配返回false。我是否必须逃离-
?
答案 0 :(得分:10)
在[
... ]
内,-
符号会被特别处理。 (您在表达式的开头使用a-z
时可以自己使用它。)
您需要转义-
字符
[a-zA-Z0-9,.;:\-_'\s]
^
或将其放在[...]
表达式中的最后一个(或第一个),如
[a-zA-Z0-9,.;:_'\s-]
^
进一步说明:
从技术上讲,所有字符在空字符串中都有效,因此我会在表达式中从+
更改为*
。
String.matches
检查完整字符串,因此^
和$
是多余的。
您的整个方法可能会被视为
return test.matches("[a-zA-Z0-9,.;:_'\\s-]*");
答案 1 :(得分:2)
两侧包围的字符类中的-
是一个正则表达式元字符,用于表示范围。
要在char类中列出文字-
,您要转义char类中的-
:
if (test.matches("^[a-zA-Z0-9,.;:\\-_'\\s]+$"))
^^^
或将-
放在char类的末尾:
if (test.matches("^[a-zA-Z0-9,.;:_'\\s-]+$"))
^
或将-
放在char类的开头:
if (test.matches("^[-a-zA-Z0-9,.;:_'\\s]+$"))
^
答案 2 :(得分:1)
您可以将-
放在字符组的开头,这样就不会将其解释为字符范围。