以下代码有效:
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
解决方案。
答案 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()
上进行部分匹配:
java.util.regex.*
? java.util.regex.Pattern
do partial matches? 在多行与单行/ Pattern.DOTALL
模式下: