2013-07-02 169 views
1

我已经使用了很多它,但我找不到任何解决方案。 对于学校项目,我需要在字符串中找到不受支持的字符不支持的字符。 允许是[A-Z\s]搜索正则表达式模式来查找“禁止”字符

我发现Pattern.match()只检查整个字符串是否匹配模式。 所以我试过这种模式:.*[^A-Z\\s].*

只要你没有在字符串中有任何换行符,它就会工作。为了检查它们,我也使用了[.\\s]*[^A-Z\\s][.\\s]*来处理它们,但现在没有任何工作了。

这将是什么正确的正则表达式?

回答

5

或者:

  • 只是反转匹配,
  • 或反转字符类和尝试,并发现只有一个字:

[四处SO缺陷 - 无法引用

final Pattern p = Pattern.compile("[^A-Z\\s]"); 
if (p.matcher(input).find()) 
    // illegal input, bark 

是,.matches()是名不副实的代码之后列表项] ...真正的正则表达式米在Java中使用.find()来完成。

+0

+1对于您的解决方案,但我不同意“真正的Java正则表达式匹配使用'find()'部分完成,这些只是两种不同的方法Matcher。'matches'试图匹配'模式'对整个输入的匹配,'find'试图在输入内匹配它。语义... – Mena

+0

m)谢谢你的作品。为什么我没有提出这个想法?感谢.find()我用你的第一个建议。'if(!Pattern.matches(“[AZ \\ s] *”,inputstr))' – s3lph

+1

@Mena no,不是语义,35年以上的正则表达式。和Java是两种主流的正则表达式语言,拒绝承认“正则表达式匹配”的意思。见证这个错误的人困惑的人数 – fge

0

尝试"(?s).*[^A-Z\\s].*"它打开dotall模式。在dotall模式下,表达式.匹配任何字符,包括行结束符。默认情况下,该表达式不匹配行结束符。请参阅Pattern.API(?idmsuxU-idmsuxU)