将CSV行与分号和带引号的字符串中的引号匹配

时间:2017-07-31 10:20:51

标签: c# regex csv double-quotes

我试图解析一个csv文件。 当然,它是通过一些在线正则表达式网页完成的,但最终必须在c#中实现。 (作为评论中某些问题的反应)

我在这里阅读了很多其他关于我自己想出来的文章, 但我坚持解决它。

我的RegExp的测试行看起来像这样(更新:在引用字符串内转义的引号):

;;“test123; weiterer Text”;;“Test mit”Zeichen im Spaltenwert“;nächsteSpaltemit”Begrenzungszeichen;“4711”; irgendwas 123,4; 1222;“foo”test“

;;"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"

必须是一列,但在引号字符串内的分号内被分割,尽管我认为我告诉表达式匹配引号内的每一行。

我们非常感谢您的帮助。 提前谢谢。

2 个答案:

答案 0 :(得分: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"
    )

答案 1 :(得分:0)

假设使用双引号进行转义("")的正确csv,可以逐行读取

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

基本上有三种匹配列的方法:

  • "(?:[^"]+|"")*"
  • 之间使用非引号或双引号开始和结束引号
  • [^;]+一系列非半音阶
  • (?<=;|^)(?=;|$) semikolons之间或semikolon与start / end之间的空字段

注意:

  • 如果你想在多行上下文中使用它,你必须在否定的字符类中添加\n
  • 它不处理与引用字段相关联的前导或尾随空格

请参阅https://regex101.com/r/twKZVN/1

(虽然正则表达式101测试PCRE模式,但所有使用的功能也都以.net模式提供。