2

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

示例源数据

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 Only 之后的项目。

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

1234
5555
2342

在一个名为的组中id

4

3 回答 3

2

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

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

我还对您的原始正则表达式进行了一些修改,因为我并没有真正看到命名捕获组内的附加捕获组的意义,或者嵌套重复 ((\d+)*相当于(\d*),但我认为您实际上想要\d+这样它需要你要匹配至少一位数字)。

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

于 2012-04-26T18:43:39.963 回答
0

断言背后的负面看法会起作用吗?

(?<![Ll]ine )(?<id>\d+)
于 2012-04-26T19:05:07.620 回答
0

您也可以不看(向前|向后)执行此操作:

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

这将为您提供一个名为的单独组中的每个数字id

  • Log\s+ID\s+: 匹配你要的ID,但不要捕获
  • (?<id>\d+),?:捕获数字并在其后允许一个可选的逗号(但不要捕获)
  • +: 至少重复一次

但是,这会带来一个问题,因为您将拥有多个具有相同名称的组 - 这取决于如何处理此问题的语言。

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

"Log\s*ID\s+(?<id>(?:\d+,?)+)"
于 2012-04-26T19:44:09.553 回答