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

标签 java regex

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

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

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

最佳答案

匹配 仅当正则表达式匹配整个字符串 时返回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. 不会强制我们在每次调用 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);

关于java - 为什么 String.matches 在 Java 中返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165485/

相关文章:

java - 如何从具有不同项目的 ListView 中打开来自同一 Activity 的不同网页?

java - Android - 全局使用onOptionsItemSelected - 多重继承

java地理工具: Sort a FeatureIterator by feature's area

java - 异步任务中的 getInputStream

c++ - TR1 正则表达式 : capture groups?

java - java中两个字符串之间的模式

python - 删除多个字符串之间的内容

javascript - 匹配类中特定结尾之前的任何字符

方法名称的 Java 和 Jython 集成问题

c++ - 减少 C++ 中的 std::regex 编译时间