You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript正则:如何仅匹配未转义双引号(不捕获前置内容)

匹配未转义的双引号(仅捕获引号本身)

我太懂你这个需求了——在JavaScript里要精准揪出字符串里没被转义的双引号,而且只想拿到引号本身,不想带着前面的转义反斜杠,还要能直接拿到它的索引,不用额外算来算去对吧?

先回顾下你的场景:给定字符串 hello"there\"boo\\\\elephant,要匹配第1个和第3个双引号,跳过中间那个被反斜杠转义的\"。之前用的正则(?<!\\)(?:\\{2})*"虽然能定位到正确的引号,但会把前面的偶数个反斜杠也包含在匹配结果里,而且JS不支持\K这种重置匹配起始位置的语法,确实麻烦。

给你一个完美适配JavaScript的正则,直接只匹配未转义的双引号本身:

/(?<=(?:^|[^\\])(?:\\{2})*)"/g

正则拆解:

  • (?<=(?:^|[^\\])(?:\\{2})*):这是正向后顾断言,用来验证引号前面的内容:
    • (?:^|[^\\]):要么是字符串的开头,要么是一个非反斜杠的字符
    • (?:\\{2})*:后面跟着任意偶数个反斜杠(0个、2个、4个……),确保这些反斜杠是成对出现的,不是用来转义当前引号的
  • ":就是我们要精准匹配的未转义双引号本身

使用示例:

const targetStr = `hello"there\"boo\\\\elephant`;
const quoteRegex = /(?<=(?:^|[^\\])(?:\\{2})*)"/g;

// 用matchAll拿到所有匹配结果
const allMatches = [...targetStr.matchAll(quoteRegex)];

allMatches.forEach(match => {
  console.log(`未转义引号的索引:${match.index}`);
  console.log(`匹配到的内容:${match[0]}`); // 输出就是单独的双引号
});

运行这段代码,你会直接得到两个匹配结果,索引分别是5和16,正好对应你要的第1个和第3个双引号,而且匹配内容就是单个的",完全不用再额外计算索引,简洁又准确。

内容的提问来源于stack exchange,提问作者junvar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:48:23