2012-08-01 127 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