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

4

我执行了以下代码:

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());执行时,打印出的匹配结果是:BIP1234EBIP5555E。但是当从代码中删除System.out.println(m.matches());后,匹配结果BIP1111E也被打印出来了。

有人能解释一下这是如何可能的吗?非常感谢您的帮助。


这个问题有点令人困惑,我觉得你的第二句话是指引用System.out.println(m.group())? - Martijn Verburg
@karianna 不会令人困惑。如果在循环之前调用了matches,则会打印出最后两个匹配项。 - khachik
@khachik - 你说得很对 - devoxx 后的疲惫眼睛;) - Martijn Verburg
2个回答

1
Java中的Matcher在给定字符串中维护了一个已找到组的索引。
例如,在您提供的字符串中 - BIP1111EgjgjgjhgjhgjgjgjgjhgjBIP1234EfghfhfghfghfghBIP5555E中,有3个匹配模式的组。
当创建Matcher时,它从索引0开始。当我们使用m.find()迭代匹配器时,每次它找到一个模式,就会标记找到模式的索引位置。
例如,第一组位于字符串的开头 - 即从字符串的第0个字符到第7个(基于0的索引)。下一次我们调用find()时,它从第8个字符开始查找下一个匹配项。
m.matches尝试匹配整个字符串,并且还操作内部索引。
在使用m.find()迭代之前调用m.matches()时,索引将从初始0移动。因此,如果您调用m.matches(),则会跳过BIP1111E的第一组。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接