这使我发疯。该字符串如下所示:
actionname {componentOne, componentTwo, componentThree}
在此示例中,我应该在actionname
,componentOne
,componentTwo
和componentThree
组中进行匹配。当然,括号中的“组件”的确切数目 我不会知道,它至少是一个,但可能是多个。
我尝试过:
\w+
初学者级别,匹配所有,包括actionname
。这可能符合目的,但是有更好的解决方案,
^actionname\s*{\s*(\w+)+\s*.*}
血腥的地狱,仅匹配一个{在本例中为componentOne
,即使我使用了量词来匹配组(\w+)+
,
^actionname\s*{\s*(\w+)(:?\s*\,\s*(\w+)|\s*})
这是失败的重点。我可以将匹配扩展到第二个组成部分,但只能以声明性方式,即,我无法将组扩展到尽可能多的单词(由,
分隔,并带有可选的空格)。呈现的所有正则表达式均带有 gm 修饰符。
如何获得正确的结果?
特别要感谢至少基本的解释,而不仅仅是可行的解决方案。
答案 0 :(得分:2)
您有两个选择,因为PCER在这里拥有我们需要的一切。首先使用正向前瞻:
\w+(?=[^{}]*})
这是一个方便的解决方法。但是,这完全取决于您的输入字符串。它说匹配单词字符,后跟(不一定是立即)紧跟大括号}
,而到达时不匹配大括号[{}]
。
另一个选项是\G
。存在\G
元字符,用于应从特定点开始的那些匹配。 \G
表示从上一个匹配结束的地方或从字符串的开头(如\A
)恢复匹配:
(?:actionname {|\G(?!\A))(\w+)[, ]*
此正则表达式的起点是看到actionname
的地方。它没有选择交替的另一面,因为我们使用负超前\G
来禁止(?!\A)
匹配字符串的开头。匹配actionname
后,它会尝试捕获单词字符并匹配其后的可选逗号和空格。如果启用g
,它将从先前的比赛结束处恢复比赛。因此它捕获了所有这些单词。
答案 1 :(得分:0)
我无法重复使用任意长度/未知长度的捕获组来在JavaScript中工作。一种解决方法是利用您期望的输入字符串是单词,然后在括号中输入CSV字符串。我们可以使用regex分隔开头的单词和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());
}