例如,给定:
hello"there\"boo\\\\"elephant
一般来说,我想匹配第一个和第三个引号,但不匹配中间的引号,因为中间的引号被转义了。这适用于 (?<!\\)(?:\\{2})*"
( Regex match unescaped quotes );但是,该正则表达式包括捕获组中的后视(例如 2 个斜线)。有没有办法让后视不捕获。
如果相关,我将使用 javascript,所以 \K
我链接的其他 stackoverflow 帖子似乎不起作用。
编辑,澄清一下,我不想替换双引号,我只是想匹配它们。我的用例具体是查找索引,但我可以使用现有查询来做到这一点,使用类似 match.index + match[0].length - 1
的东西, 但我发现它很难看,我想更好地理解正则表达式,所以我希望有一个更简单的正则表达式来查找未转义的引号,而无需在它之前捕获任何内容。
最佳答案
在我看来,您想替换那些未转义的引号,并且不需要 \K
也不需要回溯。用相应的交替组替换 lookbehind 并使用捕获组捕获您需要恢复的内容并使用替换反向引用。
s.replace(/((?:^|[^\\])(?:\\{2})*)"/g, "$1'")
参见 regex demo .
详情
((?:^|[^\\])(?:\\{2})*)
- 第 1 组(可以使用$1
访问其值> 替换模式中的占位符):(?:^|[^\\])
- 字符串的开头或\
以外的任何字符
(?:\\{2})*
- 双反斜杠出现 0 次以上
"
- 双引号。
JS 演示:
var rx = /((?:^|[^\\])(?:\\{2})*)"/g;
var s = "hello\"there\\\"boo\\\\\\\\\"elephant";
console.log("String:", s);
console.log("Result:", s.replace(rx, "$1'"));
关于javascript - 正则表达式非转义引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50261853/