-1

我正在写作以提取用引号(“)包围的字符串。我在 jquery 中使用以下语句来获取它。

var item = objstr.match(/\"(([^\"])*)\"/g);

但我想为 \" 做一个例外被允许。

4

3 回答 3

2

这个正则表达式也可以工作,而不使用前瞻或后瞻:(删除空格!)

/" (\\\\ | \\" | [^"])* "/

阅读:将字符串从双引号匹配到双引号。在这两者之间可能没有转义的反斜杠\\、转义的双引号\"或任何非引号字符或任何组合。这允许像这样的输入

"abc\\abc\abc\"abc\\\"abc"

是有效的,但不是

"abc\\"abc"
//    ^ String terminates here

如果您的字符串可能具有未转义的含义,您可能希望这样做\"

@nickb 的答案没有这个功能/错误,不管你怎么称呼它。这两个字符串在他的正则表达式中都是有效的。

如果您的正则表达式引擎能够关闭回溯,那么现在是使用它的时候了。在 Perl 中,我必须将 a 添加+到量词(或转向深奥的分支重置)。我不知道你需要什么。

/" (\\\\ | \\" | [^"])*+ "/

我们也想要贪婪的行为,所以没有*?构造。

于 2012-08-01T23:40:57.420 回答
1

我已经从http://writecodeonline.com/javascript/测试了以下代码:

var s = "wwww\"ooxx\\\"xyz\"";
var foo = s.match(/"(?:[^\\"]|\\.)*"/);
document.write(foo[0]);     
于 2012-08-02T00:07:15.290 回答
0

这个问题已经被问过很多次了,它总是引出同样明显但不正确的答案。;)

消极的lookbehind方法———— (?<!\\)"不起作用,因为它没有考虑转义的反斜杠。我知道问题中没有提到这一点,但是如果源文本使用反斜杠来转义引号,则除非另有说明,否则您应该假设它也使用它们来转义其他反斜杠。

交替方法 -- "(?:[^\\"]|\\.)*"-- 处理转义的反斜杠,但不正确。添加另一种选择 - "(\\\\|\\"|[^"])*"- 并不能解决它。它可以匹配有效的输入,但是给出了这样一个格式错误的字符串:

"escaped \"quotes\" but no ending quote

...而不是像它应该的那样报告失败的匹配,而是错误地匹配这个:

"escaped \"quotes\"

这是最好的方法,可以在 RegexBuddy 的图书馆中找到并在The Book中讨论:

/"[^"\\]*(?:\\.[^"\\]*)*"/g

如果匹配的字符串不应包含行分隔符(如 Java 字符串文字),请使用以下命令:

/"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"/g

其他方法也是可能的,但这种方法具有三个主要优点: 已被多次证明;它非常有效;而且它不依赖于高级特性——换句话说,它甚至可以在 JavaScript 中工作,JavaScript 是 Perl 派生的正则表达式风格的红发继子。:D

于 2012-08-02T01:39:37.757 回答