我正在寻找一个JavaScript正则表达式,它将逃脱单引号,但它不应该逃脱已经转义的单引号.
Ala*_*ore 14
理想情况下,您希望每场比赛都准确地从上一场比赛结束的地方开始.否则,很容易与转义序列失去同步.@outis的正则表达式接近尾声,但未能逃脱第二次单引号'\\'.在第一场比赛之后,它必须匹配至少一个非反斜杠和一个单引号,这是它无法做到的.如果还有更多字符,它会向前跳过并在第二个单引号后开始匹配.
试试这个:
result = subject.replace(/([^'\\]*(?:\\.[^'\\]*)*)'/g, "$1\\'");
Run Code Online (Sandbox Code Playgroud)
这是Friedl的"展开循环"模式的一个例子:
normal * (special normal *) *
[^'\\]*是"正常的"部分; 除了单引号或反斜杠之外,它还会吞噬任意数量的字符.如果下一个字符是反斜杠,\\.("特殊")会消耗该字符和下一个字符(反斜杠,单引号或其他)并[^'\\]*重新接管.根据需要重复.
关键点在于正则表达式永远不会向前跳过,它永远不会回溯.如果它看到反斜杠,它总是消耗掉那个和下一个字符,所以它永远不会失去同步.