将以前捕获的组与Regex匹配(返回参考?)

时间:2013-10-28 18:34:01

标签: java regex backreference

我试图使用正则表达式从文本段落中的特定行捕获一系列数字。在下面的简化示例中,我只想捕获“活动电话线”部分中的4位数字。我假设有一个未知数量的活动电话线,而且这些数字不能重复:

User Names: bob, jill, toni, tom
Active Phone Lines: 1010, 2020, 3030, 4040, 5050, 6060, 7070
Inactive Phone Lines: 1111, 2222, 3333, 4444, 5555

我知道我可以通过回车符/换行符拆分字符串,只使用([0-9]{4})的正则表达式,但我很好奇,想知道我是否只能使用一个正则表达式。

到目前为止,我能够通过以下正则表达式得到我想要的所有内容:

(?<=Active Phone Lines: |, )([0-9]{4})(?=, |\rInactive Phone Lines:)

但这将捕获“非活动电话线”的2222,3333和4444。我知道我可以使用反向引用来引用先前捕获的组,但据我所知,我只能通过捕获的顺序而不仅仅是之前的捕获来引用它们。它似乎只能在同一个表达式中工作,而不是通过搜索的多次迭代。

有没有办法支持引用先前捕获的组?假设$foo会这样做,我可以使用以下正则表达式:

(?<=Active Phone Lines: |$foo, )([0-9]{4})(?=$foo, |\rInactive Phone Lines:)

1 个答案:

答案 0 :(得分:0)

您可以使用\G这样的锚:

(?:Active Phone Lines:|\\G)[\\s,]*([0-9]{4})

在:

Pattern pattern = Pattern.compile("(?:Active Phone Lines:|\\G)[\\s,]*([0-9]{4})");
String test = "User Names: bob, jill, toni, tom"+
              "Active Phone Lines: 1010, 2020, 3030, 4040, 5050, 6060, 7070"+
              "Inactive Phone Lines: 1111, 2222, 3333, 4444, 5555";
Matcher matcher = pattern.matcher(test);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

\G匹配在上一场比赛结束时(以及字符串的开头,但这不是问题)。

ideone demo