我试图在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;问题。有人能给我带头吗?非常感谢!
答案 0 :(得分:2)
您需要一个小型解析器来处理此任务,因为没有\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);
&#13;
答案 1 :(得分:0)
您可以使用此正则表达式来获取匹配项并计算结果数组的长度:
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;
/"[^"\\]*(?:\\.[^"\\]*)*"/
将匹配引用的字符串,消耗里面的所有转义字符。
<强>输出:强>
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\"'