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

时间:2011-04-29 20:39:47

标签: regex notepad++

我的格式错误的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个案例。

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

4 个答案:

答案 0 :(得分:2)

,[^01]$

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

答案 1 :(得分:2)

您将使用的表达式是

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

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

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

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

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

答案 2 :(得分:1)

我不知道其他答案如何起作用:

以下是我在Notepad ++中使用的东西

[^,][^01]$

以下是我所做的步骤:

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

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

屏幕截图如下:

enter image description here

enter image description here

答案 3 :(得分:0)

一般注意事项

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

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

其中^与行的开头匹配,(?!.*pattern$)是一个负向超前,如果除换行符以外的其他0个或多个字符,则匹配失败({{1 }}),然后在行{.*的末尾加上pattern,而$实际上与行匹配。

要删除未以某种模式结尾的行以及结尾处的换行符,请使用

.*$

其中^(?!.*pattern$).*\R? 是可选的换行符序列。

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

\R?

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

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

将匹配不以^.*$(?<!a)(?<!bcd) a结尾的任何行。

bcd

当前问题解决方案

因此,对于当前问题,要匹配不以^.*$(?<!1)(?<!0) 1结尾的行,可以使用

0

或者

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

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

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

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