【问题标题】:Match a previously captured group with Regex (Back Reference?)将先前捕获的组与正则表达式匹配(反向引用?)
【发布时间】:2013-10-28 18:34:00
【问题描述】:

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

【问题讨论】:

  • 呃,这是java还是php?我也不太明白你想要什么。在 PHP 中,您可以使用类似 (test)(this)(?2)(?1) 的东西。这将匹配 testthisthistest
  • 这将在java中使用。目标是捕获出现在字符串“Active Phone Lines:”之后但在字符串“Inactive Phone Lines:”之前的每个 4 位数字。问题在于“Active Phone Lines:”之后会出现未知数量的 4 位数字。

标签: java regex backreference


【解决方案1】:

您可以像这样使用\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

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多