2

我正在尝试使用正则表达式从一段文本中的特定行捕获一系列数字。在下面的简化示例中,我只是尝试在“活动电话线路”部分中捕获 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:)
4

1 回答 1

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演示

于 2013-10-28T18:41:47.320 回答