捕获量词
Capturing quantifiers
我有一个正则表达式模式来捕获三个组:
(([abc])([abc])([abc]))
如何用其他方式重写它?
我试过:
(([abc]){1,3})
但只捕获到最后一组。
提前致谢。
除非您使用某些正则表达式引擎(我相信 .net 支持它),否则您无法以不同的方式执行此操作。如果您重复捕获组,则重复的匹配项将覆盖该捕获组的较早找到的匹配项。这就是为什么你最终只得到最后一场比赛的原因。
如果您不知道将出现多少个子模式实例,但您想在捕获组中捕获子模式的每个单独匹配项,这当然是一个限制。
根据(编程)环境,解决此问题的一种方法是将重复模式匹配为 1 个更大的捕获组,然后 运行 在找到的捕获上使用新的正则表达式。示例:
var inp = 'some string that matches regex & ac but we don\'t know how many letters after the regex';
var m = inp.match(/(regex).*?([abc]{1,3})/);
document.getElementById('out').value=m[2].match(/[abc]/g).join('\n');
<textarea id="out" rows="5" style="width:100%"></textarea>
如果我明白你的意思,你想将 "abc" 组作为一个整体捕获。例如,abcabcabc
而不是 abcabbc
。
如果是这样,那么您应该使用 (abc){1,3}
。参见 https://regex101.com/r/kX8aB7/3
我有一个正则表达式模式来捕获三个组:
(([abc])([abc])([abc]))
如何用其他方式重写它?
我试过:
(([abc]){1,3})
但只捕获到最后一组。
提前致谢。
除非您使用某些正则表达式引擎(我相信 .net 支持它),否则您无法以不同的方式执行此操作。如果您重复捕获组,则重复的匹配项将覆盖该捕获组的较早找到的匹配项。这就是为什么你最终只得到最后一场比赛的原因。
如果您不知道将出现多少个子模式实例,但您想在捕获组中捕获子模式的每个单独匹配项,这当然是一个限制。
根据(编程)环境,解决此问题的一种方法是将重复模式匹配为 1 个更大的捕获组,然后 运行 在找到的捕获上使用新的正则表达式。示例:
var inp = 'some string that matches regex & ac but we don\'t know how many letters after the regex';
var m = inp.match(/(regex).*?([abc]{1,3})/);
document.getElementById('out').value=m[2].match(/[abc]/g).join('\n');
<textarea id="out" rows="5" style="width:100%"></textarea>
如果我明白你的意思,你想将 "abc" 组作为一个整体捕获。例如,abcabcabc
而不是 abcabbc
。
如果是这样,那么您应该使用 (abc){1,3}
。参见 https://regex101.com/r/kX8aB7/3