我执行以下代码:
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 。
有人可以解释一下这是怎么回事吗?非常感谢你的帮助。
答案 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
字符。