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, "(?:\"[^\"]*\"|[^,])+|(?<![^,])(?![^,])")
会起作用。
【参考方案1】:
您可以使用匹配所有需要的字段
Regex.Matches(text, "(?:\"[^\"]*\"|[^,])+|(?<![^,])(?![^,])")
请参阅regex demo。 详情:
(?:\"[^\"]*\"|[^,])+
- 出现一次或多次
"[^"]*"
- 一个"
,除了"
之外的零个或多个字符,然后是一个"
(如果里面可以有""
,则替换为"[^"]*(?:""[^"]*)*"
)
|
- 或
[^,]
- 任何字符,但 ,
|
- 或
(?<![^,])(?![^,])
- 位于字符串开头或前面紧跟逗号的位置,位于结尾或紧跟逗号。
【讨论】:
以上是关于C#正则表达式用分隔符分割行,但忽略引号内的分隔符的主要内容,如果未能解决你的问题,请参考以下文章