我正在使用正则表达式替换(
其他正则表达式(或正则表达式?)与(?:
将它们转换为不匹配的组.我的表达式假设没有(?X
使用任何结构,看起来像这样:
(
[^\\] - Not backslash character
|^ - Or string beginning
)
(?:
[\(] - a bracket
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果彼此相邻有两个匹配,则不起作用,例如: how((\s+can|\s+do)(\s+i)?)?
有了lookbehinds,解决方案很简单:
/(?<=[^\\]|^)[\(]/g
Run Code Online (Sandbox Code Playgroud)
但是javascript不支持lookbehinds,所以我该怎么办?我的搜索没有带来任何简单的通用后视替代品.
通过反转使用lookbehind:
function revStr(str) {
return str.split('').reverse().join('');
}
var rx = /[(](?=[^\\]|$)/g;
var subst = ":?(";
var data = "how((\\s+can|\\s+do)(\\s+i)?)?";
var res = revStr(revStr(data).replace(rx, subst));
document.getElementById("res").value = res;
Run Code Online (Sandbox Code Playgroud)
<input id="res" />
Run Code Online (Sandbox Code Playgroud)
请注意,正则表达式模式也被反转,以便我们可以使用前视而不是后视,并且替换字符串也被反转。对于较长的正则表达式,它变得太棘手,但在这种情况下,它仍然不是那么难以阅读。