2012-06-05 56 views
1

我已经在这个形式一组字符串:正则表达式:只有分组返回的最后一场比赛

NOOO (2), { AAA (1), BBB (2), CCC-CC (3), DDD (4) } 

(元素可以是四个以上括号内)

我需要匹配的内容在括号内并提取(使用组)只有'AAA','BBB',...子字符串。所以,在这个例子中,结果将是

group1 : AAA 
group2 : BBB 
group3 : CCC-CC 
group4 : DDD 

我试着用这个表达式:

\{ (?:(\S+) \(\d+\),?\s?)+ \} 

但它返回只有最后一个匹配的组(因此,在这种情况下,唯一的“DDD”)。我错过了什么?谢谢

+0

当你说'group4'时,你的意思是单个捕获组的第四个结果吗? – alex

+0

是的,我的意思是 – TheUnexpected

回答

3

如果您使用的是.NET正则表达式,那么您的表达式将工作,因为捕获组将捕获其所有值。否则,你必须使用更复杂的正则表达式,或者分两步进行匹配,首先匹配{ ... }组,然后匹配其中的元素。

棘手的正则表达式将是这样的:

(?:{|\G(?!^),) # match a { or where the previous match ended followed by a , 
\s+    # space between elements 
(\S+)\s+\(\d+\) # an element 
(?=[^{]*})  # make sure it's eventually followed by a } 

您可以使用,如果你使用/x标志它写了表达式(也可以通过在表达式的开头加入(?x)设置)。

正则表达式没有注释:

(?:{|\G(?!^),)\s+(\S+)\s+\(\d+\)(?=[^{]*}) 

该表达式使用\G,你的正则表达式的味道有支持。 大多数现代正则表达式都有它,包括:Perl,PCRE(PHP/etc),.NET。

请注意,这样的表达并不完美。这将捕获AAABBB在下面的字符串例如:

{ AAA (1), BBB (23), CCC, something invalid here #¤%))),,,,!! } 

本书虽然,可以在必要(除了计数器)被固定。

相关问题