繁体   English   中英

正则表达式匹配所有不以,0 和,1 结尾的行

[英]Regex match all lines that don't end with ,0 and ,1

我有一个格式错误的 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 结尾。

,[^01]$

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

您将使用的表达式是

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

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

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

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

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

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

像下面这样的东西是我在记事本++中使用的

[^,][^01]$

以下是我执行的步骤:

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

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

截图如下:

在此处输入图像描述

在此处输入图像描述

一般注意事项

通常,要匹配不以特定模式结尾的行,您可以使用

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

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

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

^(?!.*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?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM