【问题标题】:Regex for Pipe Delimted with quoted Identifiers [duplicate]用引号标识符分隔的管道正则表达式 [重复]
【发布时间】:2012-08-09 09:40:05
【问题描述】:

可能重复:
Parsing CSV files in C#

我有一个解析管道分隔文件的 C# 应用程序。它使用 Regex.Split 方法:

Regex.Split(line, @"(?<!(?<!\\)*\\)\|")

然而,最近一个数据文件在其中一个数据字段中包含了一个管道。有问题的数据字段使用带引号的标识符,因此当您在 Excel 中打开时,它会正确打开。

例如,我有一个看起来像这样的文件:

Field1|Field2|"字段 3 在引号内有一个 |"|Field4

当我使用上面的正则表达式时,它会解析为:

字段1
字段2
字段 3 有一个
在引号内
字段4

当我想要时

字段1
字段2
字段 3 有一个 |在引号内
字段4

我已经进行了大量研究,似乎无法让 Regex.Split 在管道上拆分文件,但尊重引用的标识符。非常感谢任何帮助!

【问题讨论】:

  • 不要使用正则表达式来处理 csv 文件,存在 csv 解析器,参见例如this answer

标签: c# regex pipe delimiter quoted-identifier


【解决方案1】:

这是我拼凑起来的一个快速表达,似乎可以解决问题:

"([^"]+)"|([^\|]+)

虽然您的表达式似乎也与 \'s 一起做某事,所以您可能需要在此表达式中添加您有的任何其他需求。我在回答中忽略了它们,因为问题中没有解释它们,因此我无法在不知道它们为什么存在的情况下提供解决方案 - 它们实际上可能根本不需要存在。

另外,我的表达式虽然忽略了空字段(即 1||2|3 将仅作为 1、2 和 3 出现),我不知道这是否是您需要的,如果不是让我知道,我可以将表达式更改为也可以满足此要求的内容。

希望这对您有所帮助。

【讨论】:

  • 我显然对正则表达式一无所知。但是以您的示例并将其放入 C# 将无法编译。这是代码: string[] parts = Regex.Split(line, @"([^"]+)"|([^\|]+); 抛出“换行符”错误。
  • 啊,您缺少一些斜杠(即使在包含引号的字符串前面使用 @ 符号时也需要使用斜杠),并且您似乎缺少右引号和括号。试试这个: string[] parts = Regex.Split(line, @"([^\"]+)\"|([^\|]+)");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多