java - 将先前捕获的组与正则表达式匹配(反向引用?)

标签 java regex backreference

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

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:)

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

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

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

最佳答案

您可以像这样使用 \G anchor :

(?: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

关于java - 将先前捕获的组与正则表达式匹配(反向引用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642468/

相关文章:

java - 我可以在哪个容器中收集字符串来显示其中的任何一个

Python 2.6.1 (OS X 10.6.8) re.sub() 下划线组中的行为?

java - 尽管有正确的命名空间声明,我的 XSD 仍不验证 XML

java - 通俗地说,ServerSocket 构造函数

mysql - SQL 查询的选项卡分隔文件(批量更新)

regex - PowerShell按第二索引排序

regex - 绕过 sed 反向引用限制\1 到\9

javascript - JavaScript 中的正则表达式替换,某些部分保持不变

java - 使用java测量DNS查找时间

python - 正则表达式匹配字符串中任意数量的标记