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

Javascript 用反斜杠替换所有未转义的字符匹配,javascript,regex,Javascript,Regex,我正在使用正则表达式将其他正则表达式(或正则表达式?)中的()替换为(?:)以将它们转换为不匹配的组。我的表达式假定未使用(?X结构,如下所示: ( [^\\] - Not backslash character |^ - Or string beginning ) (?: [\(] - a bracket ) 不幸的是,如果有两个匹配项彼此相邻,则这不起作用,如本例:how((\s+can |\s+do)(\s+i)? 使用lookbehinds

我正在使用正则表达式将其他正则表达式(或正则表达式?)中的
)替换为
(?:
)以将它们转换为不匹配的组。我的表达式假定未使用
(?X
结构,如下所示:

(
  [^\\]     - Not backslash character
  |^        - Or string beginning
)
(?:
  [\(]      - a bracket
)
不幸的是,如果有两个匹配项彼此相邻,则这不起作用,如本例:
how((\s+can |\s+do)(\s+i)?

使用lookbehinds,解决方案很简单:

/(?<=[^\\]|^)[\(]/g
/(?(编辑)

字符串示例:

how((\s+can|\s+do)(\s+i)?)?
单线解决方案:

o='how(\\s+can |\\s+do)(\\s+i)');

警报(o.replace(/\\\(/g,9e9)。replace(/\(/g,,(?:'))。replace(/90{9}/g,,\\('))
通过反转使用回溯:

函数revStr(str){
返回str.split(“”).reverse().join(“”);
}
变量rx=/[(](?=[^\\]|$)/g;
var subst=“:?(”;
var data=“如何(\\s+can |\\s+do)(\\s+i)?”;
var res=revStr(revStr(data).replace(rx,subst));
document.getElementById(“res”).value=res;

一个选项是使用令牌(我喜欢unicode,因为它不太可能出现在其他地方)进行两次替换:

var s='how(\\s+can |\\s+do)(\\s+i)?);
var token=“\u1234”;
//查找(所需的)前面的字符
//替换。我们将在其后面添加令牌。
变量patt1=/([^\\])(?=\()/g;
//第二个模式查找令牌和(。
//我们将用所需的字符串替换这两个字符串。
var patt2=新的RegExp(标记+'\\(','g');
s=s.replace(patt1,“$1”+代币)。replace(patt2,“(?:”);

console.log(s);
第一个捕获组仍然存在。@Stribizev也许我误解了这个操作。似乎我们需要一个完整期望结果的示例。我相信期望结果是“如何(?:(?:\s+can |\s+do)(?:\s+I)?”
@nrabinowitz如果是这样的话,为什么不替换所有的呢(@AwokeKnowing:因为其中一些是文字开头的圆括号。也有很好的解决方法+1:)我只是出于兴趣才检查了一下:
\u1234埃塞俄比亚音节请参见
。关于这类音节,有很多文章供进一步阅读。正如David Conrad在中向我指出的,不要使用“不太可能的”类似于
\u1234
的字符-使用非字符的unicode代码点-我现在使用unicode中的
\uFDD1