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


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

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

仅当正则表达式匹配整个字符串时,matches才会返回true

在您的情况下,您的正则表达式仅表示一个a-zA-Z.的字符。

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

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

但是,如果您关心性能,则可以使用Matcher#find()方法

  1. 可以在找到包含正则表达式匹配项的子字符串true返回。这样,应用程序就不需要检查其余文本,这为我们节省了更多的时间,剩余文本越长。

  2. 不会强迫我们在每次调用 Pattern 时不断构建 Pattern 对象String#matches(regex)因为我们可以创建一次 Pattern 并用不同的数据重用它。

演示:

Pattern p = Pattern.compile("[^a-zA-Z\.]");
Matcher m = p.matcher("test%$@*)$(%");
if(m.find())
    System.exit(0);
//OR with Matcher inlined since we don't really need that variable
if (p.matcher("test%$@*)$(%").find())
    System.exit(0);

x.matches(y) 等效于

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

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

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

或者,您可以颠倒测试的意义:

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

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

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

最新更新