【问题标题】:Regex non-escaped quotation marks正则表达式非转义引号
【发布时间】:2025-12-26 05:05:12
【问题描述】:

例如,给定:

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

一般来说,我想匹配第一个和第三个引号,而不是中间的,因为中间的被转义了。这适用于(?<!\\)(?:\\{2})*" (Regex match unescaped quotes);但是,该正则表达式在捕获的组中包含后视(例如 2 个斜杠)。有没有办法使后视不捕获。

如果相关,我将使用 javascript,因此我链接的其他 * 帖子使用的 \K 似乎不起作用。

编辑,澄清一下,我不想替换双引号,我只是想匹配它们。我的用例具体是查找索引,但我可以使用现有查询来做到这一点,使用类似match.index + match[0].length - 1 的东西,但我觉得那很难看,我想更好地理解正则表达式,所以我希望有一个更简单的正则表达式找到未转义的引用而不捕获它之前的任何内容。

【问题讨论】:

  • 还是一样的做法,使用/((?:^|[^\\])(?:\\{2})*)"/。你很少不能没有\K,因为你可以使用捕获组来解决它。

标签: javascript regex


【解决方案1】:

在我看来,您想要替换那些未转义的引号,并且您不需要\K 也不需要lookbehinds。用相应的交替组替换后视,并使用捕获组捕获您需要恢复的内容并使用替换反向引用。

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'"));

【讨论】: