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

Match CSV line with semicolons and quotation inside a quoted string

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

我在SO上阅读了很多其他文章,自己弄明白了, 但我坚持解决它。

我的 RegExp 测试行如下所示(更新:引号在引号字符串中转义):

;;"test123;weiterer Text";;"Test mit " Zeichen 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"

问题:

到目前为止,我通过谷歌搜索和我对正则表达式的有限理解所做的就是这个表达式

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

结果如下

        [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 和 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"
    )

假设一个正确的 csv 使用双引号进行转义 (""),您可以使用

逐行读取
"(?:[^"]+|"")*"|[^;]+|(?<=;|^)(?=;|$)

基本上三种不同的方式来匹配列:

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

注:

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

https://regex101.com/r/twKZVN/1

(虽然正则表达式 101 测试的是 PCRE 模式,但所有使用的功能在 .net 模式中也可用。