【问题标题】:Regex match all lines that don't end with ,0 and ,1正则表达式匹配所有不以 ,0 和 ,1 结尾的行
【发布时间】:2011-04-29 20:39:47
【问题描述】:

我有一个格式错误的 CSV 文件,它有两列:文本、值

该值为 1 或 0,但有些行格式错误并跨越两行:

1. "This line is fine, but there are some that are not like this",0
2. "Another good line",1
4. "Oh, I'm so bad!!
5. I spanned two lines!",0
6. "Why did you break me? FileHelpers can't read two lines!!",1

第 4 行和第 5 行应该是一行,但我得到的 CSV 文件已损坏,它们跨越两行,这导致 FileHelpers 引擎在读取 csv 文件时失败。

我有两个 CSV 文件,每个文件大约 3000 行,我只需要修复它们一次。我想使用 notepad++ 查找所有不以 ,0 或 ,1 结尾的行,我可以使用哪种正则表达式?或者可能是正则表达式,一个用于 ,0 情况,另一个用于 ,1 情况。

更新:
丹的答案在没有逗号 [^01]$ 而不是 ,[^01]$ 的情况下有效,但它只匹配不以 0 或 1 结尾的行......在我的情况下它工作得很好,但它确实跳过了那些被破坏,实际上以 0 或 1 结尾。

【问题讨论】:

  • 这不是格式错误; CSV 文件中的引用字段允许包含换行符。无论您用来读取文件的内容都已损坏。
  • 我使用的是FileHelpers,当然,它不一定是格式错误,但你明白了。

标签: regex notepad++


【解决方案1】:

你会使用的表达式是

([^,].|,[^01])$

但不幸的是,notepad++ 不支持交替(| 运算符)。 [1] 然后,您可以将虚线与这两个表达式匹配:

[^,].$
,[^01]$

当然,除非“文本”部分确实以 ,0,1 本身结尾。 :-)

[1]http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Unsupported_Regex_Operators

【讨论】:

    【解决方案2】:

    ,[^01]$

    确保正则表达式模式已开启。

    【讨论】:

    • 这如何工作?该正则表达式查找以逗号结尾的所有行,后跟 not-a-0-or-1。它与您提供的示例文件中的任何内容都不匹配,Lirik。
    • @Christian Semrau:阅读问题。
    • @BoltClock:我做到了。我知道,在问题中给出的示例文件中,搜索了第 4 行。 Dan Breen 给出的正则表达式与该行不匹配。
    • 第一行和其他行中的, 也会匹配
    • @Christian True,这与第 4 行不匹配。我更关注他关于查找不以“,0”或“,1”结尾的行的声明。这是一个针对特定目的的一次性问题。它适用于 OP,我怀疑这个问题是否会被任何人用作参考......但无论如何都要为您的答案 +1 以获得更多详细信息。
    【解决方案3】:

    我不知道其他答案会如何工作:

    我将在 Notepad++ 中使用类似下面的内容

    [^,][^01]$
    

    这是我做的步骤:

    使用([^,][^01])$匹配行并替换为\1{marked}

    然后切换到扩展模式并将{marked}\r\n替换为``(空)以获得单行。

    以下截图:

    【讨论】:

    • 我没有使用答案中的逗号,Dan 只发布了 [^01]$ 然后他将其编辑为 ,[^01]$... 奇怪的是编辑是不显示
    【解决方案4】:

    一般注意事项

    一般来说,要匹配不以特定模式结尾的行,您可以使用

    ^(?!.*pattern$).*$
    

    其中^ 匹配一行的开头,(?!.*pattern$) 是一个负前瞻,如果除换行符之外还有 0 个或多个字符,则匹配失败,尽可能少 (.*) 后跟 @ 987654325@ 位于行尾 ($),.*$ 实际上与行匹配。

    要删除不以某种模式结束的行以及末尾的换行符,请使用

    ^(?!.*pattern$).*\R?
    

    其中\R? 是可选的换行序列。

    如果是多个固定字符串,可以使用

    ^(?!.*(?:pattern|pattern2|patternN)$).*\R?
    

    如果在行尾只有一两个固定字符串要检查,您可以使用更快的正则表达式,例如

    ^.*$(?<!a)(?<!bcd)
    

    这将匹配任何不以abcd 结尾的行。

    ^.*$(?<!1)(?<!0)
    

    当前问题解决方案

    因此,对于当前问题,要匹配不以10 结尾的行,您可以使用

    ^(?!.*[01]$).*$    # without the line break
    ^(?!.*[01]$).*$\R? # with the line break
    

    或者,

    ^.*(?<![01])$    # without the line break
    ^.*(?<![01])$\R? # with the line break
    

    要删除/替换不以您可以使用的特定模式结束的行上的换行符

    (?<![01])$\R?
    

    替换为空字符串(以删除换行符)或任何其他分隔符字符串或字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多