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

Posted

技术标签:

【中文标题】C#正则表达式用分隔符分割行,但忽略引号内的分隔符【英文标题】:C# Regex to split row with delimiter, but ignore delimiter inside quotes 【发布时间】:2021-11-03 13:05:35 【问题描述】:

我得到了很多文件,我对这些文件的控制为零,我需要根据分隔符进行拆分。 但是当分隔符在引号内时,我不想拆分。 所以,column1,column2,column3 是

column1
column2
column3

然而 column1, "column2," column3 是

column1
"column2," column3

这可以使用这个 RegEx(在 C# 下)

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

现在,我的问题是当一行只有一个双引号时(仅打开或关闭) 例如 column1、column2"、column3 返回

column1

column3

虽然它应该返回

column1
column2"
column3

我发现了很多与 RegEx 相关的内容,但在上述特定示例中它们都失败了。

【问题讨论】:

您似乎在解析 CSV 文件,为什么不使用built-in library (another link)?如果你只需要parse a CSV string,而不是文件。 代码使用 LINQ 来获取行的集合,这些行使用 RegEx 进行拆分。我无法更改该部分,因为它已被许多其他组件使用。 所以你的分隔符应该是文件中没有用引号括起来的任何行? 密码是什么?如果你使用.Matches,你可能只使用Regex.Matches(text, "(?:\"[^\"]*\"|[^,])+") @wizard 那么我认为Regex.Matches(text, "(?:\"[^\"]*\"|[^,])+|(?&lt;![^,])(?![^,])") 会起作用。 【参考方案1】:

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

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

请参阅regex demo。 详情

(?:\"[^\"]*\"|[^,])+ - 出现一次或多次 "[^"]*" - 一个",除了"之外的零个或多个字符,然后是一个"(如果里面可以有"",则替换为"[^"]*(?:""[^"]*)*"| - 或 [^,] - 任何字符,但 , | - 或 (?&lt;![^,])(?![^,]) - 位于字符串开头或前面紧跟逗号的位置,位于结尾或紧跟逗号。

【讨论】:

以上是关于C#正则表达式用分隔符分割行,但忽略引号内的分隔符的主要内容,如果未能解决你的问题,请参考以下文章

Java:拆分逗号分隔的字符串但忽略引号中的逗号

Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]

如何在忽略引号内的任何逗号的情况下用逗号分隔? [复制]

在逗号上拆分字符串但忽略双引号内的逗号?

python 正则表达式查找单引号内的所有单引号

正则表达式用逗号分隔 - 不在括号或单引号内