在一组中匹配量化单词字符多次
Match quantified word character as many times in a group
这让我发疯。该字符串如下所示:
actionname {componentOne, componentTwo, componentThree}
在这个例子中,我应该在 actionname
、componentOne
、componentTwo
和 componentThree
组中进行匹配。当然,括号内"components"的确切数目我不知道,至少是一个,但也可能是多个。
我试过了:
\w+
初级,匹配所有,包括actionname
。这可能符合目的,但还有更好的解决方案,
^actionname\s*{\s*(\w+)+\s*.*}
该死,只匹配一个,在本例中 componentOne
,即使我已经使用量词来匹配组 (\w+)+
,
^actionname\s*{\s*(\w+)(:?\s*\,\s*(\w+)|\s*})
失败的点在于此。我能够将匹配扩展到第二个组件,但只能声明性地 即我不能将组扩展到尽可能多的单词(由 ,
和可选空格分隔)是。所有出现的正则表达式都带有 gm 修饰符。
如何得到正确的结果?
特别感谢至少基本的解释,而不仅仅是工作解决方案。
您有两种选择,因为 PCER 拥有我们在这里需要的一切。首先使用正面前瞻:
\w+(?=[^{}]*})
这是一个方便的解决方法。但是,这完全取决于您的输入字符串。它表示匹配单词字符后跟(不一定立即)右大括号 }
到达它时不匹配大括号 [{}]
。
另一个选项是\G
。 \G
元字符存在于那些应该从特定点开始的匹配类型。 \G
表示从上一个匹配结束的地方或从字符串的开头恢复匹配(如 \A
):
(?:actionname {|\G(?!\A))(\w+)[, ]*
这个正则表达式的起点是它看到的地方actionname
。它不会选择交替的另一侧,因为我们使用否定前瞻 (?!\A)
禁用了 \G
匹配字符串的开头。匹配 actionname
后,它会尝试捕获单词字符并匹配后面可选的逗号和空格。如果启用 g
,它会从上一场比赛结束的地方恢复比赛。所以它捕获了所有这些词。
我无法让 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());
}
这让我发疯。该字符串如下所示:
actionname {componentOne, componentTwo, componentThree}
在这个例子中,我应该在 actionname
、componentOne
、componentTwo
和 componentThree
组中进行匹配。当然,括号内"components"的确切数目我不知道,至少是一个,但也可能是多个。
我试过了:
\w+
初级,匹配所有,包括actionname
。这可能符合目的,但还有更好的解决方案,
^actionname\s*{\s*(\w+)+\s*.*}
该死,只匹配一个,在本例中 componentOne
,即使我已经使用量词来匹配组 (\w+)+
,
^actionname\s*{\s*(\w+)(:?\s*\,\s*(\w+)|\s*})
失败的点在于此。我能够将匹配扩展到第二个组件,但只能声明性地 即我不能将组扩展到尽可能多的单词(由 ,
和可选空格分隔)是。所有出现的正则表达式都带有 gm 修饰符。
如何得到正确的结果?
特别感谢至少基本的解释,而不仅仅是工作解决方案。
您有两种选择,因为 PCER 拥有我们在这里需要的一切。首先使用正面前瞻:
\w+(?=[^{}]*})
这是一个方便的解决方法。但是,这完全取决于您的输入字符串。它表示匹配单词字符后跟(不一定立即)右大括号 }
到达它时不匹配大括号 [{}]
。
另一个选项是\G
。 \G
元字符存在于那些应该从特定点开始的匹配类型。 \G
表示从上一个匹配结束的地方或从字符串的开头恢复匹配(如 \A
):
(?:actionname {|\G(?!\A))(\w+)[, ]*
这个正则表达式的起点是它看到的地方actionname
。它不会选择交替的另一侧,因为我们使用否定前瞻 (?!\A)
禁用了 \G
匹配字符串的开头。匹配 actionname
后,它会尝试捕获单词字符并匹配后面可选的逗号和空格。如果启用 g
,它会从上一场比赛结束的地方恢复比赛。所以它捕获了所有这些词。
我无法让 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());
}