Javascript Regex:计算字符串中未转义的引号

时间:2016-08-24 11:11:34

标签: 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个引号,因为\在第2个"之前在它之前被\逃脱。

我找到了一个在ruby中完成工作的regexp(并且用pcre格式化),但是它使用Javascript中不存在的构造,例如负面的lookbehinds (?>!并重置匹配的起始点\K

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

我已尝试将其翻译为Javascript正则表达式,但无济于事。

我认为像

这样的东西
(?:\\(?="))|(")

(匹配斜杠后跟&#34;或者自己的斜杠) 应该做的伎俩,但它没有工作,甚至没有考虑到\&#34;问题。有人能给我带头吗?非常感谢!

3 个答案:

答案 0 :(得分:2)

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

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用此正则表达式来获取匹配项并计算结果数组的长度:

&#13;
&#13;
var arr=['"I am string 1" "I am string 2"',
         '"I am \\"string 1\\"" "I am string 2"',
         '"I am string 1\\\\" "I am string 2"'
        ];

for (i=0; i<arr.length; i++) {
   console.log(arr[i].match(/"[^"\\]*(?:\\.[^"\\]*)*"/g).length * 2)
}
&#13;
&#13;
&#13;

/"[^"\\]*(?:\\.[^"\\]*)*"/将匹配引用的字符串,消耗里面的所有转义字符。

RegEx Demo

<强>输出:

4
4
4

答案 2 :(得分:0)

一种简单的解决方案是先去除所有转义的引号,然后重新转义整个字符串。

val = '"I am \"string 1\"" "I am string 2"';
val = val.replace(/\"/gm, '"');
val = val.replace(/(["])/gm,'\$1');

结果将是:

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