替换未使用反斜杠转义的所有字符匹配项

Tom*_*ica 8 javascript regex

我正在使用正则表达式替换(其他正则表达式(或正则表达式?)与(?:将它们转换为不匹配的组.我的表达式假设没有(?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,所以我该怎么办?我的搜索没有带来任何简单的通用后视替代品.

Wik*_*żew 2

通过反转使用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)

请注意,正则表达式模式也被反转,以便我们可以使用前视而不是后视,并且替换字符串也被反转。对于较长的正则表达式,它变得太棘手,但在这种情况下,它仍然不是那么难以阅读。