名称捕获,需要一个数字列表

时间:2012-04-26 18:26:04

标签: regex

我需要在列表中生成一个命名的数字捕获

示例源数据

This is a comment on line 1
Here is another Comment Line 2
Log ID 1234,5555,2342

使用:(?<id>(\d+)*)我将获取

的结果
1
2
1234
5555
2342

但这会错误地选择12。我需要它来获取仅Log ID之后的项目。

我正在寻找一个将返回的正则表达式

1234
5555
2342

在名为id

的命名组中

3 个答案:

答案 0 :(得分:2)

如果您的语言支持可变长度的lookbehinds,您应该能够使用以下内容:

(?<=Log ID.*)(?<id>\d+)

我还对原始正则表达式进行了一些修改,因为我没有真正看到命名捕获组内部的附加捕获组的重点,或者嵌套重复((\d+)*等同于{{1但是我认为你实际上想要(\d*),所以它要求你至少匹配一个数字。)

如果你不能使用可变长度的lookbehinds(大多数语言),那么你可能需要分两步完成。首先匹配任何带有“Log ID”的行,然后在这些行中查找数字。

答案 1 :(得分:0)

断言背后的负面看法会不会这样做?

(?<![Ll]ine )(?<id>\d+)

答案 2 :(得分:0)

你也可以这样做而不看(前方):

"Log\s+ID\s+((?<id>\d+),?)+"

这将为您提供名为id

的单独组中的每个数字
  • Log\s+ID\s+:匹配您之后的ID,但不捕获
  • (?<id>\d+),?:捕获数字并在其后面添加一个可选的逗号(但不要捕获)
  • +:至少重复一次

但是,这会引入一个问题,因为您将拥有多个具有相同名称的组 - 这取决于语言的处理方式。

或者,您可以使用此正则表达式将日志ID后的整个字符串捕获到一个组中:

"Log\s*ID\s+(?<id>(?:\d+,?)+)"
相关问题