【问题标题】:Regex - How can I remove specific characters between strings/delimiters?正则表达式 - 如何删除字符串/分隔符之间的特定字符?
【发布时间】:2016-02-14 09:36:21
【问题描述】:

这与在其他地方解析文件之前清理文件有关,即格式错误/丑陋的 CSV。我看到很多删除/匹配某些字符串/字符/分隔符之间所有字符的示例,但我找不到特定字符串的任何示例。行的示例部分如下所示:

","Should now be allowed by rule above "Server - Access" added by Rich"\r

需要明确的是,这不是整行,而是整行用引号括起来并用“,”分隔,并以 ^M 结尾(Windows 换行符/回车符)。前面的“列”将被括起来在每一边用“,”。我可能也会使用它来删除行中较早出现的杂物。

我想要的是删除 "," 和 "\r ("Server - Access" - 这些) 之间的所有双引号,而不删除分隔符。或者,我可能只是找到它们并将它们替换为\" 为 Ruby CSV 库分隔它们。到目前为止,我有这个:

(?<=",").*?(?="\\r)

基本上匹配分隔符之间的所有内容。如果我替换 .*?对于任何东西,无论是字母、双引号等,我都得到零匹配。我做错了什么?

注意:这应该是 Ruby 兼容的。

【问题讨论】:

  • 替换块内的匹配项。
  • 这不是仅使用正则表达式就能完成的事情。您必须检查下一行的开头看起来如何,然后确定该行是否正确开始,或者它是否是嵌入式行尾的结果。如果是因为嵌入的线端,那么您需要适当地加入这些线。这不是一个简单的问题。

标签: ruby regex csv


【解决方案1】:

如果我理解正确,你可以使用negative lookahead and lookbehind

text = '","Should now be allowed by rule above "Server - Access" added by Rich"\r'
puts text.gsub(/(?<!,)"(?![,\\r])/, '\"')
# ","Should now be allowed by rule above \"Server - Access\" added by Rich"\r

当然,如果值本身可以包含逗号和换行符,这将不起作用...

【讨论】:

  • 这就是为什么我需要分隔符是“,”然后是“\r(包括双引号)而不仅仅是逗号或\r。这样我知道我不会核对任何东西在列中。我已经用反斜杠替换逗号并定界,以确保 CSV 库可以正确输出。
  • 我的意思是,如果逗号可以成为字符串的一部分,那么并不能真正保证您不会将"," 作为字符串的一部分......跨度>
  • 啊,我明白了。老实说,这是一场持久战,但如果我能解析 80% 的这些文件,那对我的团队来说将大大减少工作量。这永远不需要 100% 面向客户。我会给你的解决方案一个测试运行。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多