我正在寻找一个 JavaScript 正则表达式,它将转义单引号,但它不应该转义已经转义的单引号。
最佳答案
理想情况下,您希望每场比赛都从上一场比赛结束的地方开始。否则很容易与转义序列不同步。 @outis 的正则表达式很接近,但它无法转义 '\\'
中的第二个单引号。在第一次匹配之后,它必须匹配至少一个非反斜杠和一个单引号,这是它做不到的。如果还有更多字符,它会向前跳过并在第二个单引号之后开始匹配。
试试这个:
result = subject.replace(/([^'\\]*(?:\\.[^'\\]*)*)'/g, "$1\\'");
这是 Friedl 的“展开循环”模式的示例:
普通*(特殊普通*)*
[^'\\]*
是“普通 *”部分;它吞噬了除单引号或反斜杠之外的任意数量的字符。如果下一个字符是反斜杠,\\.
(“特殊”)会使用该字符和下一个字符(反斜杠、单引号或其他字符)和 [^'\\]*
再次接管。根据需要重复。
关键是正则表达式从不跳过,也从不回溯。如果它看到一个反斜杠,它总是使用那个和下一个字符,所以它永远不会不同步。
关于Javascript 正则表达式转义引号(但不转义已经转义的引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8874509/