Java正则表达式基本使用问题

时间:2010-05-11 06:27:56

标签: java regex

以下代码有效:

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是一个包含多行的文本块,如果匹配器对它们进行不同的处理,同样在实际代码中,replace将用于替换一串文本。

无论如何,奇怪的是它适用于第一个版本而不是其他两个版本。

修改

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

2 个答案:

答案 0 :(得分:3)

您的最后几个示例失败,因为matches向正则表达式添加了隐式的开始和结束锚点。换句话说,它必须是整个字符串的精确匹配,而不是部分匹配。

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

答案 1 :(得分:1)

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

来自java.util.regex.Matcher API

  

创建后,匹配器可用于执行三种不同的匹配操作:

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

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

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

相关问题

matches()上匹配整个字符串:

hitEnd()上进行部分匹配:

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