在一组中匹配量化单词字符多次

Match quantified word character as many times in a group

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

actionname {componentOne, componentTwo, componentThree}

在这个例子中,我应该在 actionnamecomponentOnecomponentTwocomponentThree 组中进行匹配。当然,括号内"components"的确切数目我不知道,至少是一个,但也可能是多个。

我试过了:

\w+

初级,匹配所有,包括actionname。这可能符合目的,但还有更好的解决方案,

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

该死,只匹配一个,在本例中 componentOne,即使我已经使用量词来匹配组 (\w+)+

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

失败的点在于此。我能够将匹配扩展到第二个组件,但只能声明性地 即我不能将组扩展到尽可能多的单词(由 , 和可选空格分隔)是。所有出现的正则表达式都带有 gm 修饰符。

如何得到正确的结果?

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

您有两种选择,因为 PCER 拥有我们在这里需要的一切。首先使用正面前瞻:

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

live demo here

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

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

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

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

live demo here

我无法让 arbitrary/unknown 长度的重复捕获组在 JavaScript 中工作。一种解决方法是利用您预期的输入字符串是一个单词,后跟括号中的 CSV 字符串。我们可以使用正则表达式来隔离前导词和 CSV 字符串,然后将该 CSV 内容或任意长度拆分为一个数组。

var input = "actionname {componentOne, componentTwo, componentThree}";
var re = /^(\S+)\s+\{([^}]+)\}$/g;
var m;

m = re.exec(input);
results = [];
if (m) {
    results.push(m[1]);
    results.push(m[2].split(/, /));
    console.log(results.toString());
}