我正试图在 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/