【问题标题】:Java regex basic usage problemJava regex 基本使用问题
【发布时间】:2010-05-11 06:27:56
【问题描述】:

以下代码有效:

String str= "test with foo hoo";
Pattern pattern = Pattern.compile("foo");
Matcher matcher = pattern.matcher(str);

if(matcher.find()) { ... }

但是这个例子没有:

if(Pattern.matches("foo", str)) { ... }

这个版本也没有:

if(str.matches("foo")) { ... }

在实际代码中,如果匹配器对 str 的处理方式不同,str 是多行的文本块,同样在实际代码中,replace 将用于替换一串文本。

无论如何,奇怪的是它在第一个版本中有效,而在其他两个版本中无效。

编辑

好的,我意识到如果使用if(matcher.matches()) { ... } 而不是matcher.find,第一个示例中的行为是相同的。我仍然无法使其适用于多行输入,但我还是坚持使用Pattern.compile/Pattern.matcher 解决方案。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您的最后几个示例失败了,因为matches 在您的正则表达式中添加了一个隐式的开始和结束锚点。也就是说,它必须是整个字符串的完全匹配,而不是部分匹配。

    您可以改用.*foo.* 来解决此问题。使用Matcher.find 是更灵活的解决方案,所以我建议坚持使用。

    【讨论】:

    • Ok .*//.* 解决了单行示例,但是如何将其扩展到多行输入呢?
    • @Ernelli:你可以使用 DOTALL 模式。 Dotall mode can also be enabled via the embedded flag expression (?s)
    【解决方案2】:

    在 Java 中,String.matches 委托给 Pattern.matches,后者又委托给 Matcher.matches,后者检查正则表达式是否匹配整个字符串

    来自java.util.regex.Matcher API

    一旦创建,匹配器可用于执行三种不同类型的匹配操作:

    • matches 方法尝试将整个输入序列与模式进行匹配。
    • lookingAt 方法尝试将输入序列从开头开始与模式进行匹配。
    • find 方法扫描输入序列,寻找与模式匹配的下一个子序列。

    要查找子字符串是否匹配模式,您可以:

    • Matcher.find() 字符串中的pattern
    • 检查整个字符串matches .*pattern.*

    相关问题

    matches()匹配整个字符串:

    hitEnd() 上进行部分匹配:

    在多行与单行/Pattern.DOTALL 模式下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多