2011-11-09 33 views
5

我有以下方法检查允许的字符不工作:正则表达式来检查允许的字符在Java中

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

但如果测试有字符-在它的比赛返回false。我必须逃脱-

+1

为什么你不试试逃跑? – Simon

回答

9

里面[ ... ]-符号被特殊处理。 (你自己使用它在这个特殊的目的,你的表情,你必须a-z的开始。)

你需要躲避-字符

[a-zA-Z0-9,.;:\-_'\s] 
      ^

或把它放在最后一个(或第一)在[...]表达像

[a-zA-Z0-9,.;:_'\s-] 
       ^

一些进一步的说明:

  • 从技术上讲,所有字符在空字符串中都是有效的,所以我会在表达式中将+更改为*

  • String.matches检查完整字符串,所以^$是多余的。

  • 你的整个方法可以wirtten为

    return test.matches("[a-zA-Z0-9,.;:_'\\s-]*"); 
    
+0

感谢您的解释:) –

+0

没问题。别客气。 – aioobe

+0

因为我们有'a-zA-Z0-9_'作为字符类的一部分,它是不是简化了使用'\ w'的东西?,也就是''[\\ w,。;:'\\ s - ] *“' – ishnid

1

你可以把-在字符组的起始,使其不被解释为一个字符范围。

2

A -在包围两边的字符类中是一个表示范围的正则表达式元字符。

要在焦炭类列出文字-你逃避的焦炭类-

if (test.matches("^[a-zA-Z0-9,.;:\\-_'\\s]+$")) 
           ^^^ 

或将-在字符类的末尾:

if (test.matches("^[a-zA-Z0-9,.;:_'\\s-]+$")) 
            ^

或放置- char类开头:

if (test.matches("^[-a-zA-Z0-9,.;:_'\\s]+$")) 
        ^
相关问题