2013-10-22 65 views
1

刪除行我有一個線從CSV正則表達式從CSV

first decimal;;;first text;;second text with newlines, special symbols, including semicolons;second decimal, always present;first dot separated float, may not present;second dot separated float, may not present;third text that present only if present previous float

我需要刪除第二個文本(新線和特殊符號)。

至於現在我有表達,如:

(?<=;;)(.*?)(?=;\d+) 

第一部分不工作,我不知道如何使它選擇只有兩個分號(前文現在它選擇文本前面有兩個或多個分號和第一個小數,前面加分號+換行符,如果我打開dotall)。此外,我不知道如何在這裏包含換行符號(.*?)

+0

正如蒂姆在他的回答的最後一行中所建議的那樣,儘管可以用正則表達式來完成這項工作,但總是使用正確的工具來完成這項工作。考慮一個CSV庫。 –

回答

1

如果你有一個包含分號和換行符的CSV文件作爲引用字段的一部分,那麼正則表達式不是正確的工具。想象一下,如果你有像"This is one field;;don't split this;42"這樣的字段會發生什麼......

如果你確定在引用字段之前或之內不會有兩個分號,那麼你可以嘗試一下正則表達式。但專用的CSV解析器絕對是一個更安全的選擇。

那麼,讓我們來看看爲什麼你的正則表達式失敗:

想象線1;;;2;3。你的正則表達式匹配;2,因爲它符合所有要求 - 前面有兩個分號,後面有一個分號加數字。這也是在這個位置上最短的匹配。

你能做什麼?你可以使用另一種向後斷言,以確保它不可能在當前位置之前,以匹配三個分號:

(?<=;;)(?<!;;;)(.*?)(?=;\d+) 

試試看 - 但考慮CSV庫也是如此,因爲他們會更好的解決您的問題。

+0

你建議所有相同的表達選擇第一個文本(前面有三個分號)。 – PASAf

+0

@PASAf:哦,對。我編輯了答案。 –