C# 正则表达式使用分隔符拆分行,但忽略引号内的分隔符

C# Regex to split row with delimiter, but ignore delimiter inside quotes

提问人:wizard 提问时间:9/6/2021 最后编辑:wizard 更新时间:9/7/2021 访问量:359

问:

我得到了很多文件,在这些文件中我没有任何控制权,我需要根据分隔符进行拆分。 但是当分隔符在引号内时,我不想拆分。 所以,column1、column2、column3 是

column1
column2
column3

然而 column1, “column2,” column3 是

column1
"column2," column3

这使用此正则表达式(在 C# 下)工作

((?<=\")[^\"]*(?=\"(,|$)+)|(?<=,|^)[^,\"]*(?=,|$))

现在,我的问题是当有一行只有一个双引号(仅开始或结束)时 例如 column1、column2“、column3 返回

column1

column3

虽然它应该返回

column1
column2"
column3

我发现了很多与正则表达式相关的正则表达式,但它们在上面的特定示例中都失败了。

C# 正则表达式 分隔符 引号

评论

3赞 Wiktor Stribiżew 9/6/2021
您似乎正在解析CSV文件,为什么不使用内置库另一个链接)?如果您只需要解析 CSV 字符串,而不是文件。
0赞 wizard 9/6/2021
该代码使用 LINQ 获取使用正则表达式拆分的行的集合。我无法更改该部分,因为它被许多其他组件使用。
0赞 Niel Godfrey Pablo Ponciano 9/6/2021
因此,您的分隔符应该是文件中未用引号括起来的任何行?
0赞 Wiktor Stribiżew 9/6/2021
代码是什么?如果你使用 ,你可能只使用 。.MatchesRegex.Matches(text, "(?:\"[^\"]*\"|[^,])+")
1赞 Wiktor Stribiżew 9/6/2021
@wizard 然后我认为会起作用。Regex.Matches(text, "(?:\"[^\"]*\"|[^,])+|(?<![^,])(?![^,])")

答:

1赞 Wiktor Stribiżew 9/7/2021 #1

您可以使用匹配所需的所有字段

Regex.Matches(text, "(?:\"[^\"]*\"|[^,])+|(?<![^,])(?![^,])")

请参阅正则表达式演示细节

  • (?:\"[^\"]*\"|[^,])+- 出现一次或多次
    • "[^"]*"- a 、零个或多个字符,然后是 和 a(如果里面可以有,请替换为""""""[^"]*(?:""[^"]*)*")
    • |-或
    • [^,]- 任何字符,但,
  • |-或
  • (?<![^,])(?![^,])- 位于字符串开头或紧跟逗号的位置,位于末尾或紧跟逗号的位置。