我正在写作以提取用引号(“)包围的字符串。我在 jquery 中使用以下语句来获取它。
var item = objstr.match(/\"(([^\"])*)\"/g);
但我想为 \" 做一个例外被允许。
我正在写作以提取用引号(“)包围的字符串。我在 jquery 中使用以下语句来获取它。
var item = objstr.match(/\"(([^\"])*)\"/g);
但我想为 \" 做一个例外被允许。
这个正则表达式也可以工作,而不使用前瞻或后瞻:(删除空格!)
/" (\\\\ | \\" | [^"])* "/
阅读:将字符串从双引号匹配到双引号。在这两者之间可能没有转义的反斜杠\\
、转义的双引号\"
或任何非引号字符或任何组合。这允许像这样的输入
"abc\\abc\abc\"abc\\\"abc"
是有效的,但不是
"abc\\"abc"
// ^ String terminates here
如果您的字符串可能具有未转义的含义,您可能希望这样做\"
。
@nickb 的答案没有这个功能/错误,不管你怎么称呼它。这两个字符串在他的正则表达式中都是有效的。
如果您的正则表达式引擎能够关闭回溯,那么现在是使用它的时候了。在 Perl 中,我必须将 a 添加+
到量词(或转向深奥的分支重置)。我不知道你需要什么。
/" (\\\\ | \\" | [^"])*+ "/
我们也想要贪婪的行为,所以没有*?
构造。
我已经从http://writecodeonline.com/javascript/测试了以下代码:
var s = "wwww\"ooxx\\\"xyz\"";
var foo = s.match(/"(?:[^\\"]|\\.)*"/);
document.write(foo[0]);
这个问题已经被问过很多次了,它总是引出同样明显但不正确的答案。;)
消极的lookbehind方法———— (?<!\\)"
不起作用,因为它没有考虑转义的反斜杠。我知道问题中没有提到这一点,但是如果源文本使用反斜杠来转义引号,则除非另有说明,否则您应该假设它也使用它们来转义其他反斜杠。
交替方法 -- "(?:[^\\"]|\\.)*"
-- 处理转义的反斜杠,但不正确。添加另一种选择 - "(\\\\|\\"|[^"])*"
- 并不能解决它。它可以匹配有效的输入,但是给出了这样一个格式错误的字符串:
"escaped \"quotes\" but no ending quote
...而不是像它应该的那样报告失败的匹配,而是错误地匹配这个:
"escaped \"quotes\"
这是最好的方法,可以在 RegexBuddy 的图书馆中找到并在The Book中讨论:
/"[^"\\]*(?:\\.[^"\\]*)*"/g
如果匹配的字符串不应包含行分隔符(如 Java 字符串文字),请使用以下命令:
/"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"/g
其他方法也是可能的,但这种方法具有三个主要优点: 已被多次证明;它非常有效;而且它不依赖于高级特性——换句话说,它甚至可以在 JavaScript 中工作,JavaScript 是 Perl 派生的正则表达式风格的红发继子。:D