无论如何都要将群组反转到非捕获群体,反之亦然?
例如我们有这个:
(a(bc(def)gh)ijk)
我们需要为此做一些魔术:
(?:a(?:bc(?:def)gh)ijk)
当然有一些魔法可以找到打开/左括号并替换它们(?:应该有效,对吗?不...考虑这个:
(a(bc(d[(e]f)gh)ijk)
现在我们内置了[(e]
,这意味着可以有一个字符(
或e
。
我们的替换算法将如何处理它?</ p>
(?:a(?:bc(?:d[(?:e]f)gh)ijk)
他不应该将[(e]
更改为[(?:e]
我所说的算法是另一个正则表达式:
/(\()(?!\?\:)/gi;
用于找到尚未?:
的左括号。
首先搜索这些括号,然后检查每个括号是否为前缀\
,因为我们不想更改转义左括号,最后用(?:
替换它们
现在..如何处理这些括号... [abc(]
?
答案 0 :(得分:1)
我正在使用的正则表达式匹配转义括号和任何字符集。然后它捕获任何剩余的组。它排除了负面比赛。它还可以捕获组是否正在捕获。
var input = /(a(?:bc(d[(e]f)gh)i\(jk[(?!lmnop])/;
var find = /\\\(|\[[^\]]*\]|(\((?!\?!)(?:)?)/g;
input.source.replace(find, function(match, group, capturing) {
if (group) {
if (capturing) { return "(?:"; }
else /* non-capturing */ { return "("; }
}
return match;
});