正则表达式:使用System.out.println(m.matches())时不会打印所有匹配项;

时间:2010-11-20 16:24:19

标签: java

我执行以下代码:

public static void test() {
 Pattern p = Pattern.compile("BIP[0-9]{4}E");

 Matcher m = p.matcher("BIP1111EgjgjgjhgjhgjgjgjgjhgjBIP1234EfghfhfghfghfghBIP5555E");
 System.out.println(m.matches());
 while(m.find()) {
  System.out.println(m.group());
 }

}

我无法解释的是,使用 System.out.println(m.matches())执行代码; 打印的匹配项为: BIP1234E BIP5555E 即可。 但是当 System.out.println(m.matches()); 从代码中删除时,也会打印出matche BIP1111E

有人可以解释一下这是怎么回事吗?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Java中的Matcher维护给定字符串中找到的组的索引。

例如,在您的示例中提供的字符串中 - BIP1111EgjgjgjhgjhgjgjgjgjhgjBIP1234EfghfhfghfghfghBIP5555E

有3组匹配模式

BIP1111E BIP1234E BIP5555E

创建匹配器时,它从索引0开始。当我们使用m.find()迭代匹配器时,每次找到一个模式时,它都会标记找到的模式的索引位置。

例如,第一个gourp位于字符串的开头 - 即从0开始并一直到字符串的第7个(基于0的索引)字符。下次我们说find()它从第8个字符开始,找到模式的下一个匹配。

m.matches尝试匹配整个字符串,它还操纵内部索引。

在使用m.find()进行迭代之前调用m.matches()时,索引将从初始值0移开。因此,如果调用m.matches(),则跳过第一组BIP1111E

答案 1 :(得分:0)

调用Matcher.reset后,您可以使用matches方法将匹配器重置为初始状态。该方法更改了匹配器对象的当前状态,并在下次调用find时开始查看第一个g字符。