【问题标题】:Regex: Remove line breaks in double quote field?正则表达式:删除双引号字段中的换行符?
【发布时间】:2020-01-07 09:25:44
【问题描述】:

我有一个包含此错误的 .csv 文件,我想用正则表达式更正,某些字段包含换行符,例如:

"abc

de
f 123",123,456

应该在一行,我只想删除换行符但保留文本

"abcdef 123",123,456

我尝试在双引号内进行隔离,但这仅删除了第一个换行符:

^(?:"[0-9a-zA-Z])\r?\n(?=",)

(文本可以包含数字和其他字符,所以我尝试包含它们,我只想删除换行符并保留所有其他字符,希望清楚)

【问题讨论】:

  • 听起来您缺少多行标志,因为您使用的是 ^
  • 如果你不能为开/关引号定义左右手上下文,你不能用一个正则表达式来实现它(因为左右手分隔符是相同的)。最好的方法是使用一些 CSV 解析器和您认为合适的格式来读取文件。
  • 有什么例子吗?尝试^(?:"[0-9a-zA-Z])?m\r?\n(?=",) 没有结果...
  • 你能假设第一行总是以双引号开头吗?如果是这样,您可以尝试\r?\n(?!") 并将其替换为空:删除所有换行符,除非下一行的开头有双引号
  • @WiktorStribiżew 我用"定义左边,用",定义右边

标签: regex powergrep


【解决方案1】:

如果您使用重复捕获组,则无法在单个查询中捕获多个换行符;正则表达式引擎只能抓取最后一场比赛。话虽如此,如果您使用的是 powergrep(或其他一些可以选择性地替换捕获组,而不是整个匹配项的搜索和替换),您真的需要单行吗?

^"(?:[^"\n]|(\n+))*", 将在 "", 之间查找并匹配任何不包含 " 的文本,将其保留在引用的语句中 - 或者,将 捕获 em> 它找到的最后一组换行符。如果您的工具只能删除/替换捕获组中的文本,为什么不连续使用此正则表达式几次?它会单独留下您的无错字行,但每次运行时都会从您的错误行中删除一大块空白。 (Try it here! 请注意,这匹配所有行,但仅捕获格式错误的空格)

你怎么知道什么时候完成?尝试使用^(?=.*\n.*)"[^"]*", - 它会匹配 csv 文件中仍然有换行符的任何行,但会忽略格式正确的行。当此正则表达式没有返回匹配项时,您可以确信您的文件没有错字。 (Try it here!)

这不是一个非常优雅的解决方案,但如果你运行它足够多次,你就会摆脱所有的空白。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多