我正在尝试使用正则表达式从一段文本的特定行中捕获一系列数字。在下面的简化示例中,我只是试图捕获“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
匹配上一个匹配项的末尾(和字符串的开头,但这不是这里的问题)。
关于java - 将先前捕获的组与正则表达式匹配(反向引用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642468/