2017-07-31 39 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