2012-08-01 151 views
-1

我写以提取由引号(“)。我用jQuery中下面的语句来得到它。正则表达式是不允许“并允许”

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

包围字符串,但我想打一个\“的例外情况被允许。

+0

你试过了什么? – 2012-08-01 23:14:31

+0

到目前为止,您尝试过哪些方法不适合您?你使用什么样的正则表达式(PCRE,perl,.NET)?请编辑您的问题以添加您所做的工作,并为相应的正则表达式引擎添加标记。如果你提供给我们的信息,你很可能会得到帮助(你也会更快地获得帮助)。 – 2012-08-01 23:16:09

回答

2

此正则表达式可能工作为好,不使用查找aheads或查找屁股:(!空格去掉)

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

阅读:从双引号匹配字符串以双引号。在这两者之间可能有或没有逃脱反斜杠\\的任意组合,逃脱双引号\"或任何非引号字符。这允许输入像

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

是有效的,但不是

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

你可能想,如果你的字符串可能有转义意义\"

从@nickb答案不具有此特性/错误,无论你怎么称呼它。两个字符串在他的正则表达式中都是有效的。

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

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

我们也希望贪婪行为,所以没有*?结构。

0

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

负回顾后发的方法 - (?<!\\)" - 不工作,因为它没有考虑到为逃脱的反斜杠。我知道,这不是在问题中提到,但如果原文用反斜杠转义引号,你应该假设除非特别指出,它使用他们逃离其他反斜杠,太。

的交替的方法 - "(?:[^\\"]|\\.)*" - 以逃脱反斜杠,但不正确的交易。并且增加另一个替代方案 - "(\\\\|\\"|[^"])*" - 不能解决它。它匹配有效的输入没关系,但给出这样一个畸形的字符串:

"escaped \"quotes\" but no ending quote 

...而不是报告一个失败的比赛,因为它应该,它错误地匹配这样的:

"escaped \"quotes\" 

这里是最好的方法,因为在使用RegexBuddy的库中找到并讨论了The Book

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

如果匹配的字符串不应该包括行分隔符(如Java字符串),使用此:

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

其他方法是可能的,但这一个有三个主要先行tages:它已经被证明很多次了。它非常有效;它不依赖于高级功能 - 换句话说,它甚至可以在JavaScript中使用,它是Perl衍生的正则表达式的红头发的继承人。 :D