代码之家  ›  专栏  ›  技术社区  ›  junvar

Regex非转义引号

  •  1
  • junvar  · 技术社区  · 8 年前

    例如,给定:

    hello"there\"boo\\\\"elephant

    一般来说,我希望匹配第一个引号和第三个引号,但不匹配中间的引号,因为中间的引号是转义的。这适用于 (?<!\\)(?:\\{2})*" ( Regex match unescaped quotes );但是,该正则表达式在捕获的组中包含look-behind(例如2个斜杠)。是否有一种方法可以使后面的外观不被捕获。

    如果相关,我将使用javascript,因此 \K 我链接的另一个stackoverflow帖子似乎不起作用。

    编辑,澄清一下,我不想替换双引号,我只是想匹配它们。具体来说,我的用例是查找索引,但我可以使用现有的查询,使用 match.index + match[0].length - 1

    1 回复  |  直到 8 年前
        1
  •  1
  •   Wiktor Stribiżew    8 年前

    在我看来,你似乎想替换那些未替换的引用,而这样做你并不需要 \K 也不向后看。用相应的替换组替换lookbehind,并用捕获组捕获需要恢复的内容,并使用替换的backreference。

    s.replace(/((?:^|[^\\])(?:\\{2})*)"/g, "$1'")
    

    请参见 regex demo 。

    详细信息

    • ((?:^|[^\\])(?:\\{2})*) -组1(其值可通过访问 $1 替换模式中的占位符):
      • (?:^|[^\\]) -字符串的开头或除 \
      • (?:\\{2})* -0多次出现双反斜杠
    • " -双引号。

    JS演示:

    var rx = /((?:^|[^\\])(?:\\{2})*)"/g;
    var s = "hello\"there\\\"boo\\\\\\\\\"elephant";
    console.log("String:", s);
    console.log("Result:", s.replace(rx, "$1'"));