我需要在列表中生成一个命名的数字捕获
示例源数据
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
但这会错误地选择1
和2
。我需要它来获取仅Log ID之后的项目。
我正在寻找一个将返回的正则表达式
1234
5555
2342
在名为id
答案 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+,?)+)"