[英]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)
这将匹配任何不以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
要删除/替换不以特定模式结束的行上的换行符,您可以使用
(?<![01])$\R?
替换为空字符串(以删除换行符)或任何其他分隔符字符串或字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.