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



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

actionname {componentOne, componentTwo, componentThree}

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

我试过了:

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());
}

相关内容

  • 没有找到相关文章

最新更新