【问题标题】:Regular expression with special character inside CSV with quoted matchesCSV 中带有特殊字符的正则表达式,带引号匹配
【发布时间】:2015-05-26 05:18:32
【问题描述】:

我试过了,这是我能想到的最好的方法,需要重新审视或帮助完成这项工作。

表达式:

\"[a-zA-Z\s0-9\.\']*\"

输入字符串数据:

BOL,"AWBH0876356","HMM","H0010","BEANR","BEANR","AEJEA","BHBAH","","","T","S","","","F","N","","FCL/FCL","BE","","","","","","","","SUNNYLAND DISTRIBUTION NV","EVERDONGENLAAN 12 2300 TURNHOUT","","","INTERNATIONAL AGENCIES CO LTD","BUILDING 406, ROAD 4308, BLOCK 343, MANAMA BAHRAIN","","INTERNATIONAL AGENCIES CO LTD","BUILDING 406, ROAD 4308, BLOCK 343, MANAMA BAHRAIN","","","","","","","N/A","770000",""SHIPPER'S LOAD & COUNT, SAID TO BE:" 1X20'DC CONTAINER S.T.C 1650 CARTON OF JUICES FREIGHT PREPAID","1650","CARTONS","CTN","","","1","1","2.2","21615.0","23815.0","0","0","0","0","","",""

我需要忽略第一个单词 (BOL) 和逗号,这是有效的,但我遇到了包含特殊字符 (',") 的匹配项。

下面的匹配是一个问题,例如:

""SHIPPER'S LOAD & COUNT, SAID TO BE:" 1X20'DC CONTAINER S.T.C 1650 CARTON OF JUICES FREIGHT PREPAID"

【问题讨论】:

  • CSV 没有真正合适的标准,但我知道在 CSV 文件中引用的任何方法都不会产生您的输出。我想说生成这些 CSV 文件的过程需要修复才能获得可解析的文件。
  • 谢谢!但恐怕现在这不是一个选择,否则它会让我的事情变得更容易,而且我早就有了解决方案。

标签: asp.net regex parsing csv c#-4.0


【解决方案1】:
(?:^|(?<=,))"(?!,")(.+?)"(?=,"|$)

试试这个。查看演示。

https://regex101.com/r/tJ2mW5/4

【讨论】:

  • 问题在于它不解析以下 正确引用 CSV 行:"Field","Another "","" field""","More Fields"。当您收到一个无效文件时,很难同时组合一个正则表达式来处理它有效文件。
  • @Phylogenesis 你给的例子不是这个预期的输出吗? regex101.com/r/tJ2mW5/5
  • 不,"" 被认为是 CSV 中引用的 "。我的示例中只有 3 个字段。
【解决方案2】:

您的正则表达式(以及要解析的字符串)的当前问题是它不接受值内有引号而字符串有引号。也许,你可以指定里面可以有一个引号,但是,结束引号应该只在逗号之前或字符串的末尾,你可以用积极的lookhead来做到这一点:

".*?"(?=,|$)

regex101 demo

".*?" 匹配该值,而(?=,|$) 确保其后有逗号或字符串结尾(由$ 表示)。

请注意,如果您的字符串的值包含引号字符后跟逗号,则上述正则表达式将不起作用。

在这种情况下,我通常做的是计算匹配的数量。如果这超出了我的预期,我将原始行分开放置,以便我可以一一查看(这将涉及一些人工干预,但这总比出现很多错误要好!)。

如果所有问题都来自单个列,那么您可以更改脚本,以便它将值从 i '合并'到 j (i 是出现第一个问题的列号,j 是下一个问题),直到有适当数量的值。

【讨论】:

  • 如果您有一个“更合适”的 csv 文件,其中真正转义的引号有一些异常,那么使用 "(?:""|.)*?"(?=,|$) 可能会更好。
  • 它比这更好。一些 CSV 文件使用反斜杠来引用双引号,因此您需要使用 (?:""|\\"|.)
  • (?:["\\]"|.) 像@Phylogenesis 一样更容易(而且速度更快) :) 您可以将创建 csv 的人添加到字符类中的任何其他转义字符。不过说真的,我更喜欢制表符分隔的或管道分隔的。您在文本中遇到这些的可能性要小得多,因此更容易解析。
  • 很公平。最后,我更喜欢制表符分隔的文件,因为这样的解析问题和 CSV 的非标准化性质。 (这正是您编辑的评论现在所说的!)
  • 谢谢杰瑞,这太棒了。您可能是正则表达式之神(至少对我而言)。返回值的确切数量,即 60 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2011-02-20
  • 2015-12-23
  • 2016-08-08
  • 2017-12-17
相关资源
最近更新 更多