gpt4 book ai didi

正则表达式:分组只返回最后一个匹配

转载 作者:行者123 更新时间:2023-12-04 05:44:16 25 4
gpt4 key购买 nike

我有一组这种形式的字符串:

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”)。我错过了什么?谢谢

最佳答案

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

棘手的正则表达式如下所示:

(?:{|\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 #¤% ))),,,,!! }

如果需要,也可以修复(计数器除外)。

关于正则表达式:分组只返回最后一个匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10889972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com