使用逗号分割文本,但忽略字符串中的任何字符

Posted

技术标签:

【中文标题】使用逗号分割文本,但忽略字符串中的任何字符【英文标题】:Split a text using comma but ignore any character inside string 【发布时间】:2021-11-26 17:04:21 【问题描述】:

我有一个奇怪的情况,我需要使用 demeter(,) 拆分如下文本,但必须忽略字符串中的逗号。我已经使用正则表达式模式,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

现在的问题是我的文本包含字符串,但也包含一个单独的双引号(")。我无法更改文本,因为此数据是由某些数据引擎生成的。

这是我需要拆分的文本-

355,170102,204500,204509,10,"SOME TEXT 10"","COM","COM","Not Split"

请注意"SOME TEXT 10"" 中有一个额外的双引号,它不是成对的。由于这种拆分不适用于这种类型的文本。

我期待结果如下-

355
170102
204500
204509
10
"SOME TEXT 10"
"COM"
"COM"
"Not Split"

但是得到的结果是-

355,170102,204500,204509,10,"SOME TEXT 10""
"COM"
"COM"
"Not Split"

如何做到这一点?任何线索将不胜感激。

【问题讨论】:

您需要详细定义规则。如果这是常见的 CSV 输入,则应该定义一个转义字符,并且一个常见的示例看起来像这样 123,"Text""with quotest" - 原因:如果这个额外的引号没有转义字符并且允许在您的文本中的任何地方出现并且允许文本包含逗号,则无法拆分。示例:"This "funny","short" example" - 是指This "funnyshort" example 还是This "funny","shrt" example 顺便说一句:如果这是 CSV 输入,我会考虑使用 lib,因为 CSV 有边缘情况。参见例如CSVHelper。 @ChristophLütjen CSVHelper 可以处理字段内容中的“狂野”、未转义的引号吗?像这里一样,"SOME TEXT 10""? CSVHelper 无法处理非标准 CSV 文件(这似乎是)。我很想回到你从哪里得到这个文件,问为什么有一个未转义的双引号。 这个示例列是正确的"SOME TEXT 10"" 还是应该是`""SOME TEXT 10""? 【参考方案1】:

如果您要将正则表达式更改为:

,(?=(?:[^"]*"[^"]*""?)*[^"]*$)

在字符串的右双引号之后添加额外的可选",那么您最终会得到以下拆分:

355
170102
204500
204509
10
"SOME TEXT 10""
"COM"
"COM"
"Not Split"

问题是"SOME TEXT 10"" 字符串,您可能可以忍受。但是,如果您将正则表达式进一步修改为:

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

", 前面是输入和 yield 的第一个引用字符串时,它也会拆分:

355
170102
204500
204509
10
"SOME TEXT 10"
"COM"
"COM"
"Not Split"

See C# Demo

【讨论】:

以上是关于使用逗号分割文本,但忽略字符串中的任何字符的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Spark忽略字符串中的逗号

使用逗号拆分字符串,但忽略双引号内的逗号 - javascript

拆分字符串忽略引用的部分