2012-04-26 77 views
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

+0

是有多个日志的ID一样,在真实的数据线? – dc5553 2012-04-26 18:30:12

+0

字符串'日志ID'总是在那里?总是有三个ID?它们总是用逗号分隔吗? – alan 2012-04-26 18:40:24

+0

它是否总是采用完全相同的格式“Log ID 1234,5555,2342”? – Jack 2012-04-26 18:51:50

回答

2

如果你的语言支持可变长度lookbehinds,你应该能够使用以下命令:

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

我也对你的原始正则表达式做了一些修改,因为我真的没有看到附加捕获组的点o f指定的捕获组或嵌套重复((\d+)*相当于(\d*),但我认为您实际上需要\d+,以便它要求您至少匹配一位数字)。

如果你不能使用可变长度lookbehinds(大多数语言),那么你可能需要分两步做到这一点。首先用“日志ID”匹配任何行,然后在这些行中查找数字。

+0

您不能在向后看中使用可变长度。 – Jack 2012-04-26 18:44:20

+1

@杰克 - 在.NET正则表达式(可能还有其他),你可以。 – 2012-04-26 18:45:38

+0

这个作品完全谢谢你。所提出的其他解决方案都存在小问题。 – 2012-04-26 20:17:07

0

背后的否定断言会做诡计吗?

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

你也可以做到这一点没有看(提前|后面):

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

这会给你的每一个号码在id

  • Log\s+ID\s+一个单独的名为组:比赛您以后的ID,但不捕获
  • (?<id>\d+),?:捕获号码并允许选择逗号之后(但不捕获)
  • +:重复至少一次

然而,这引起一个问题,因为你将有几组具有相同的名称 - 这取决于语言这将如何被处理。

或者您可以使用此正则表达式来登录ID后,整个字符串捕获到一个组:

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