【发布时间】:2013-07-19 18:23:44
【问题描述】:
我正在使用正则表达式来解析类似 CSV 的文件。我是正则表达式的新手,虽然它可以工作,但当有很多字段并且其中一个字段包含很长的值时,它会变得很慢。如何优化它?
我必须解析的 CSV 具有以下风格:
- 所有字段都是用逗号分隔的引号括起来的字符串
- 字段内的引号以两个连续引号的形式转义
- 在某些行的开头有不可预知的垃圾需要被忽略(到目前为止它不包含引号,谢天谢地)
- 可以使用零长度字段和字段中的换行符
我正在使用 VB.NET。我正在使用以下正则表达式:
(^(?!").+?|^(?="))(?<Entry>"(",|(.*?)"(?<!((?!").("")+)),))*(?<LastEntry>"("$|(.*?)"(?<!((?!").("")+))$))
我通过将 StreamReader.ReadLine's 输入字符串变量来处理换行符,直到正则表达式成功,用空格替换换行符(这对于我的目的来说是可以的)。 然后我使用 Match.Groups("Entry").Captures 和 Match.Groups("LastEntry") 提取字段内容。
我想性能影响来自对转义引号的后视。有没有更好的办法?
感谢您的任何想法!
【问题讨论】:
-
您可以构建一个简单的解析器,它 (a) 比任何正则表达式解决方案都要快,(b) 更具可读性,(c) 更易于调试。