繁体   English   中英

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

[英]Why is String.matches returning false in Java?

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

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

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

仅当正则表达式匹配整个 string 时, matches返回true 在您的情况下,您的正则表达式仅代表一个不是azAZ. .

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

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

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

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

  2. 不会强迫我们在每次调用String#matches(regex)时不断构建 Pattern 对象,因为我们可以创建 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 如果您只想知道x某个子字符串是否与y匹配,那么您需要使用find()而不是matches()

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM