正则表达式 : count unescaped quotes in string

标签 javascript regex

我正试图在 Javascript 中找到一个正则表达式来解决一个看似简单的问题,但我整个上午都在用头撞墙。我正在尝试使用 string.match 计算出现在字符串中的引号。问题是转义的引号不应该被计算在内,但是前面有转义反斜杠的引号应该被再次计算在内。

作为辅助信息,我只是想看看该行中存在的所有字符串是否都已正确关闭,并且我认为如果是这种情况,该行中应该存在相同数量的引号。

几个例子:

'"I am string 1" "I am string 2"'

显然应该数 4 个引号

'"I am \"string 1\"" "I am string 2"'

应该仍然计算 4 个引号,因为应该跳过在字符串 1 内转义的引号。

'"I am string 1\\" "I am string 2"'

应该计算 4 个引号,因为第二个 "前面的\被前面的\转义了。

我找到了一个在 ruby​​ 中完成工作的正则表达式(并在 pcre 中格式化),但它使用了 Javascript 中不存在的构造,例如负向后视 (?>! 和重置匹配的起点 \K

(?<!\\)(?:\\{2})*\K"

我试图将其转换为 Javascript 正则表达式,但无济于事。

我估计是这样的

(?:\\(?="))|(")

(匹配斜杠后跟 "或单独的斜杠) 应该可以解决问题,但它不起作用,甚至不能解决\"问题。任何人都可以给我一个线索吗?非常感谢!

最佳答案

您需要一个小型解析器来处理此任务,因为没有 \G 运算符可以将后续匹配锚定到上一个成功匹配的末尾。

var s = "\"some text\" with 5 unescaped double quotes... \\\"extras\" \\some \\\"string \\\" right\" here \"";

var res = 0;
var in_entity = false;
for (var i=0; i<s.length; i++) {
  if ((s[i] === '\\' && !in_entity) || in_entity) { // reverse the flag 
     in_entity = !in_entity;
  } else if (s[i] === '"'  && !in_entity) { // an unescaped "
      res += 1;
  }
}
console.log(s,": ", res);

关于正则表达式 : count unescaped quotes in string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39121743/

相关文章:

javascript - X 轴上的 Highcharts 系列名称

javascript - 创建多个 jQuery/Javascript 小部件

javascript - 如何使用 Webpack 运行 Angular 2 AOT

javascript - 匹配带有前导或尾随星号的行的正则表达式

javascript - 通过滚动和调整滚动大小在关于部分中使用英雄图像

javascript - 您可以在使用 minify 库缩小的 .js 文件中使用 PHP 吗?

Java 正则表达式,过滤文档以获取信号词和停用词列表

python - python 上的正则表达式将字符串吐出到特定序列中

php - 正则表达式匹配golang sql dsn

Javascript 正则表达式返回 # 字符,即使它没有被捕获