Java模式匹配器行为

时间:2014-11-14 09:13:45

标签: java regex

说我编译一个正则表达式模式:

 String myString = "manifest"; 
 p = Pattern.compile( myPattern, Pattern.CASE_INSENSITIVE  );
 Matcher m = p.matcher( myString );
 if ( m.matches() ){
   .....
 }

例如,当我将myPattern指定为ni时,myString无法匹配。但是当我将myPattern指定为.*ni.*时,它会匹配。

在我的代码的后半部分中,我将要用新模式替换myPattern中定义的任何内容。例如,如果我将ni指定为要替换的2个字符,那么它只会替换ni。如果我指定.*ni.*,则整个字符串将替换为新模式。现在我的问题是它没有匹配。

有什么可以解决这个问题? 感谢

2 个答案:

答案 0 :(得分:4)

matches尝试将整个输入与模式匹配(正如文档中所述),当然manifest并非完全匹配ni但与.*ni.*完全匹配。但是,例如,如果您使用find,它会在输入中 的某处搜索模式。还有lookingAt,它试图匹配"当前"在输入中的位置。

答案 1 :(得分:3)

这完全取决于您使用的Matcher方法:

  • matches():如果且仅当整个区域序列与此匹配器模式匹配时才为true
  • find():如果且仅当输入序列的子序列与此匹配器模式匹配时才为true

示例:

String input = "manifest";
Matcher m1 = Pattern.compile("ni").matcher(input);
System.out.println(m1.matches()); // false
System.out.println(m1.find()); // true
Matcher m2 = Pattern.compile(".*ni.*").matcher(input);
System.out.println(m2.matches()); // true
System.out.println(m2.find()); // false

此外,find()允许您迭代匹配:

while (m2.find()) {
    String groupX = m2.group(x);
}