为什么String.matches在Java中返回false?

时间:2013-11-23 17:25:16

标签: java regex

if("test%$@*)$(%".matches("[^a-zA-Z\\.]"))
    System.exit(0);

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

即使正则表达式应该返回true,程序也不会退出。代码有什么问题?

3 个答案:

答案 0 :(得分:7)

仅当整个字符串与正则表达式匹配时,

matches才会返回true。在您的情况下,您的正则表达式仅代表一个字符,而不是a-zA-Z.

我怀疑您要检查字符串是否包含您在regex中描述的这些特殊字符之一。在这种情况下,用.*围绕你的正则表达式让正则表达式匹配整个字符串。哦,你不必在角色类.内逃避[.]

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

答案 1 :(得分:6)

x.matches(y)相当于

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

并要求整个字符串x与正则表达式y匹配。如果您只是想知道x某些子字符串是否匹配y,那么您需要使用find()代替matches():< / p>

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

或者你可以改变测试的意义:

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

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

答案 2 :(得分:0)

您始终获取false,因为matches()方法仅在模式与完整字符串匹配时才返回true。