Javascript正则表达式:计算字符串中的未转义引号

问题描述:

我试图在Javascript中找到一个看似简单的问题的正则表达式,但我一直在关于它的整个早上都在打击我的头。我试图用string.match来计算字符串中出现的引号符号。值得注意的是,不应该计算出逃脱的引号符号,但是前面带有反斜杠的引号应该是再次。Javascript正则表达式:计算字符串中的未转义引号

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

举几个例子:

'"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个引号,因为\在第二的前“由\才逃过一劫。

我已经找到了正则表达式,其确实在红宝石的工作(在PCRE格式化),但它使用结构不Javascript中存在,如负lookbehinds (?>!和重置匹配\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);

+0

谢谢!这似乎是为了完成这项工作。它只是让我感到无法用Javascript中的一个正则表达式来解决这个问题。这似乎很简单。 –

+0

这对JS中的正则表达式不是基本的。在.NET中,你可以使用像''(? (%3F%3A%5B%5E%22%5C%5C%5D%7C(%22)%7C%5C%5C)。*%24&I =%22text +%5C%22more%5C%22 +文本%22 +和+ no + more +%22escaped%22 + quotes)并计算第1组捕获的数量。 Python PyPi正则表达式和Boost正则表达式库(支持捕获集合)的特定构建也可以做到这一点。 –

+0

是的,我只是。这似乎是JavaScript中唯一可能的选择。再次感谢! –

您可以使用此正则表达式来抓住比赛和计数导致数组的长度:

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) 
 
}

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

RegEx Demo

输出:

4 
4 
4 
+0

如果输入有逃脱'“这将失败'第一。事实是,你不能用JS正则表达式解决问题。写一个小的解析器。 –

+0

是的,这个正则表达式只适用于带有平衡引号的输入。 – anubhava