首页 > 解决方案 > 在一个组中多次匹配量化的单词字符

问题描述

这让我发疯。该字符串如下所示:

actionname {componentOne, componentTwo, componentThree}

在此示例中,我应该在组中actionname匹配componentOne,componentTwocomponentThree. 当然,我不知道括号内“组件”的确切数量,它至少是一个,但可能是多个。

我试过:

\w+

初学者级别,匹配所有,包括actionname. 这可能适合目的,但有更好的解决方案,

^actionname\s*{\s*(\w+)+\s*.*}

该死的,只匹配一个,在这种情况下componentOne,即使我使用量词来匹配组(\w+)+

^actionname\s*{\s*(\w+)(:?\s*\,\s*(\w+)|\s*})

这就是失败的重点。我可以将匹配扩展到第二个组件,但只能以声明方式进行,即我不能将 group 扩展到尽可能多的单词(由,可选空格分隔)。呈现的所有正则表达式都带有gm修饰符。

如何得到正确的结果?

特别感谢至少基本的解释,而不仅仅是工作解决方案。

标签: javascriptregexpcreregex-group

解决方案


您有两种选择,因为 PCER 拥有我们需要的一切。首先使用积极的前瞻:

\w+(?=[^{}]*})

在此处查看现场演示

这是一个方便的解决方法。但是,这一切都取决于您的输入字符串。它表示匹配后跟(不一定立即)右大括号的单词字符,但在到达它时}不匹配大括号。[{}]

另一种选择是\G\G元字符存在于那些应该从特定点开始的匹配中。\G表示从上一个匹配结束的地方或从字符串的开头恢复匹配(as \A):

(?:actionname {|\G(?!\A))(\w+)[, ]*

这个正则表达式的起点就是它看到的地方actionname。它不会选择交替的另一端,因为我们\G使用负前瞻来禁用匹配字符串的开头(?!\A)。匹配后actionname,它会尝试捕获单词字符并匹配其后的可选逗号和空格。如果g启用,它将从先前匹配结束的位置恢复匹配。所以它捕获了所有这些词。

在此处查看现场演示


推荐阅读