2013-11-23 244 views
2
if("test%[email protected]*)$(%".matches("[^a-zA-Z\\.]")) 
    System.exit(0); 

if("te/st.txt".matches("[^a-zA-Z\\.]")) 
    System.exit(0); 

即使正则表达式应该返回true,程序也不会退出。代码有什么问题?为什么String.matches在Java中返回false?

+2

如果你认为它应该返回true,那么你的正则表达式并没有做你认为它正在做的事情。请告诉我们你认为应该怎么做,以便我们可以告诉你哪里出了问题。 – Dukeling

+0

另一个疯狂的猜测在这里。但是你有意使用'^'来表示行的开始吗?如果是这样,你做错了。 – Sanchit

+0

曾经试过'if(matcher.find()== true)return matcher.group(0);' –

回答

6

matches返回true只有当整个字符串匹配正则表达式。在你的情况下,你的正则表达式只代表一个字符不是a-z,A-Z.

我怀疑你想检查字符串是否包含你在正则表达式中描述的这些特殊字符之一。在这种情况下,使用.*来包围您的正则表达式,让正则表达式匹配整个字符串。呵呵,你不必逃跑.里面的字符类[.]

if ("test%[email protected]*)$(%".matches(".*[^a-zA-Z.].*")) { 
    //string contains character that is not in rage a-z, A-Z, or '.' 
0

您获得始终为false,因为matches()方法只有当图案完整字符串匹配返回true。

4

x.matches(y)相当于

Pattern.compile(y).matcher(x).matches() 

,并要求整个字符串x匹配正则表达式y。如果你只是想知道是否有一些子的x匹配y,那么你需要使用find()而不是matches()

if(Pattern.compile("[^a-zA-Z.]").matcher("test%[email protected]*)$(%").find()) 
    System.exit(0); 

另外,您可以扭转测试的意义:

if(!"test%[email protected]*)$(%".matches("[a-zA-Z.]*")) 

通过提供一个与允许的字符串匹配的模式而不是不允许的字符,然后查看测试字符串是否失败以匹配此模式RN。

+0

准确,简洁,完整。不错的工作。 +1 – ridgerunner