这让我发疯。该字符串如下所示:
actionname {componentOne, componentTwo, componentThree}
在这个例子中,我应该在一组actionname
、componentOne
、componentTwo
和componentThree
中匹配。当然,括号内"组件"的确切数量我不知道,它至少是一个,但可能是多个。
我试过了:
w+
初级水平,匹配所有,包括actionname
。这可能适合目的,但有更好的解决方案,
^actionnames*{s*(w+)+s*.*}
血腥地狱,只匹配一个,在这种情况下componentOne
,甚至我也用量词来匹配组(w+)+
,
^actionnames*{s*(w+)(:?s*,s*(w+)|s*})
这一点的失败是重点。我能够将匹配项扩展到第二个组件,但只能以声明方式扩展,即我无法将组扩展到尽可能多的单词(由,
用可选空格分隔(。所有呈现的正则表达式都带有gm修饰符。
如何获得正确的结果?
特别感谢至少基本的解释,而不仅仅是有效的解决方案。
您有两种选择,因为PCER拥有我们在这里所需的一切。首先使用积极的展望:
w+(?=[^{}]*})
在此处观看现场演示
这是一个方便的解决方法。但是,这一切都取决于您的输入字符串。它表示匹配后跟(不一定立即(右大括号的单词字符}
在到达时不匹配大括号[{}]
。
另一个选项是G
.G
元字符存在于那些应该从特定点开始的匹配类型中。G
表示从上一个匹配结束的位置或字符串的开头恢复匹配(如A
(:
(?:actionname {|G(?!A))(w+)[, ]*
这个正则表达式起点是它看到actionname
的地方。它不会选择交替的另一面,因为我们使用负的前瞻(?!A)
禁用了G
匹配字符串的开头。匹配actionname
后,它会尝试捕获单词字符并匹配其后的可选逗号和空格。如果启用了g
,它将从上一个匹配结束的位置恢复匹配。所以它捕捉了所有这些词。
在此处观看现场演示
我无法让任意/未知长度的重复捕获组在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());
}