2017-07-31 70 views
0

我試圖解析一個csv文件。 這是一個在線正則表達式的網頁,但最終必須在C#中實現。 (如在評論的一些問題反應)將CSV行與分號和引號內的引號進行匹配

我讀了很多在這裏上的其他articels的呆着, 但即時通訊卡在解決它弄明白。

我爲我的正則表達式測試線看起來像這樣(UPDATE:報價逃脫的內部引號的字符串):

;; 「test123; weiterer文本」 ;; 「測試麻省理工學院的」 賊臣IM Spaltenwert「;nächste Spalte MIT 「Begrenzungszeichen;」 4711 「; irgendwas 123,4; 1222;」 foo 「的測試」

;;"test123;weiterer Text";;"Test mit "" Zeichen im Spaltenwert";nächste Spalte mit "" Begrenzungszeichen;"4711";irgendwas 123,4;1222;"foo""test" 
  • ;是分隔符
  • 是引用列
  • 符號

問題:

  • 行可能包含空列(分號後面分號 沒有任何文字)
  • 引用的字符串可能包含引號的跡象,像這裏 「Test mit」Zeichen im Spaltenwert「
  • 列分隔符也可能出現在帶引號的字符串中,如下所示:」test123; weiterer Text「

什麼我有幾個谷歌搜索迄今所做的和我的正則表達式的有限的理解是這樣的表達

(? < =^|)(\ 「\」。| [^] *)| [^] +

這得到以下結果

 [0] => 
     [1] => 
     [2] => "test123 
     [3] => weiterer Text" 
     [4] => 
     [5] => "Test mit " Zeichen im Spaltenwert" 
     [6] => nächste Spalte mit " Begrenzungszeichen 
     [7] => "4711" 
     [8] => irgendwas 123,4 
     [9] => 1222 
     [10] => "foo"test" 

https://www.myregextester.com/

問題測試現在我已經是在元件2和3本文

"test123;weiterer Text" 

必須是一列,但在引用字符串內的分號被splited,但我想我告訴EXPRES以匹配引號內的所有內容。

任何幫助這裏是高度讚賞。 在此先感謝。

+0

你是什麼意思「什麼是你的正則表達風味」?我不明白。使用csv解析器可能是將來的一個選項,但目前不是因爲現有的實現,我必須解決這個問題。 – Dom84

+0

Curerntly與提到的URL下的工具,myregextester.com 但最終與C# – Dom84

+1

如果引用的部分還可以包含未轉義的報價,則無法解決您的問題。 –

回答

0

假設使用一倍引號轉義("")一個適當的CSV,即逐行讀取可以使用

"(?:[^"]+|"")*"|[^;]+|(?<=;|^)(?=;|$) 

基本上有三種不同的匹配方法:

  • "(?:[^"]+|"")*"開始,以非引號或雙引號關閉了一系列非semikolons
  • (?<=;|^)(?=;|$) semikolons之間或semikolon和開始/結束之間

注意空字段的

  • [^;]+之間的報價:

    • 如果你想在多行上下文中使用這個,你必須在中加上否定字符類
    • 它不處理開頭或結尾帶引號字段

    連接見空間https://regex101.com/r/twKZVN/1

    (雖然正則表達式101測試一個PCRE模式,使用的所有功能也都在.NET模式可用。

  • 0
    (?<=^|;)(\"[^"]*\";|\".\"|[^;]*)|[^;]+ 
    

    用於合併2添加這部分和3 \"[^"]*\";

    [0] => Array 
        (
         [0] => 
         [1] => 
         [2] => "test123;weiterer Text"; 
         [3] => 
         [4] => "Test mit " Zeichen im Spaltenwert" 
         [5] => nächste Spalte mit " Begrenzungszeichen 
         [6] => "4711"; 
         [7] => irgendwas 123,4 
         [8] => 1222 
         [9] => "foo"test" 
        ) 
    
    +0

    你可能有一個想法如何也可以匹配的列?目前不是。 「foo」te; st「(在同一列中引用AND分號) – Dom84