正则表达式,用于检查允许的字符在Java中不起作用

时间:2011-11-09 10:46:10

标签: java regex

我有以下方法来检查允许的字符:

private boolean checkIfAllCharsAreValid(String test) {
    boolean valid = false;
    if (test.matches("^[a-zA-Z0-9,.;:-_'\\s]+$")) {
        valid = true;
    }
    return valid;
}

但如果test中包含字符-,则匹配返回false。我是否必须逃离-

3 个答案:

答案 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)

您可以将-放在字符组的开头,这样就不会将其解释为字符范围。