2010-05-25 85 views
6

我需要搜索以未終止的雙引號字符串結尾的CSV文件中的行。用於查找未終止字符串的正則表達式

例如:

1,2,a,b,"dog","rabbit 

將匹配而

1,2,a,b,"dog","rabbit","cat bird" 
1,2,a,b,"dog",rabbit 

不會。

非常使用正則表達式有限的經驗,我能想到的唯一的事情是一樣的東西

"[^"]*$ 

然而,最後報價到行的末尾匹配。

這將如何完成?

+1

什麼' 「A \」 BC 「'或'」 A 「」 BC「'? – SLaks 2010-05-25 15:57:25

+0

假設有沒有 」中間「 引號(沒有嵌套引號) – 2010-05-25 16:00:57

回答

5

假設引號不能被轉義,你需要測試引號的奇偶校驗(確保偶數個而不是奇數)。正則表達式非常適合:

^(([^"]*"){2})*[^"]*$ 

這將匹配所有包含偶數引號的行。您可以反轉所有具有奇數的字符串的結果。或者,你可以在開始添加其他([^"]*")部分:

^[^"]*"(([^"]*"){2})*[^"]*$ 

同樣,如果你有機會獲得勉強運營商,而不是貪心的孩子,你可以使用一個簡單的看的表達:

^((.*"){2})*.*$   #even 
^.*"((.*"){2})*.*$  #odd 

現在,如果報價可以逃脫,那完全是一個完全不同的問題,但方法是類似的:確定未轉義報價的平價。

+0

最後兩個正則表達式中不應該有一些問號嗎?但我會推薦因爲@SLaks提到:潛在的失控回溯你的第一種方法應該是安全的,因爲正則表達式中沒有任何一部分可以和相鄰的部分匹配相同的字符 - 所有匹配的都是引用或者不要引用 – 2010-05-25 16:31:14

+0

@Alan:關於問號,取決於你的正則表達式。有些正則表達式使用'*?'作爲不情願的Kleene clo當別人要求你給正則表達式分配標誌以告訴解釋者Kleene閉包不情願的時候。其他人可能會認爲他們默認情況下不願意,需要明確告訴他們貪婪。 – Welbog 2010-05-25 17:06:22

+0

我不知道任何默認情況下將量詞視爲不情願的正則表達式。 PHP有'U'修飾符,這使得他們不情願,除非你使用問號來使他們貪婪。很多人,其中的我自己都認爲該功能是一個錯誤,應該強烈建議用戶不要使用它。無論它帶來什麼樣的好處,它所帶來的混亂都會被取消。 – 2010-05-25 21:06:19

4

假設該字符串不能包含",你需要匹配有奇數個引號,像這樣的字符串:

([^"]*("[^"]*")?)*"

注意,這是容易受到DDOS攻擊。

這將匹配零個或多個不帶引號的運行集,然後是帶引號的字符串。

+0

爲什麼會是容易受到DDOS? – 2010-05-25 16:03:58

+0

這是http://msdn.microsoft.com/en-us/magazine/ff646973.aspx(其他答案也很脆弱) – SLaks 2010-05-25 16:04:21

0

爲了避免 「嵌套expandos將」:

egrep -v '^[^"]*("[^"]*"[^"]*)*[^"]*$' my_file 
+0

這仍然是一個嵌套expando(一個更好的術語將是一個嵌套的重複) – SLaks 2010-05-25 16:11:34

+0

好的,我正在讀這個作爲「嵌套括號的東西」。 – DVK 2010-05-25 16:18:51

1

試試這個:

".+[^"](,|$) 

這(在該行的任何地方),報價匹配其次(貪婪)的任何另一在行末或逗號之前引用。

淨影響是它只會與懸掛引用的字符串相匹配的行。

我認爲它甚至免疫'嵌套擴展攻擊'(我們生活在一個非常危險的世界......)

相關問題