匹配换行符,除非它以分号结尾

时间:2016-02-08 13:57:55

标签: regex

我想匹配换行符\ n,除非该行以分号结尾。 到目前为止,我的尝试是(?!; \ n)\ n,它与换行符匹配,但不排除任何内容。示例文本:

this is a line of text that should match
it should exclude this line;
this line should also be ignored;
but this should match

3 个答案:

答案 0 :(得分:5)

使用否定的字符类

.*[^;]$

这与测试数据暗示的行匹配。仅作为捕获

将行末尾的换行符完全匹配
.*[^;](\n)

这是perl中的演示,显示了这种行为,假设testdata位于文件textdata.txt

perl -n -e 'print ord($1)."yes line $. $1" if /.*[^;](\n)/; ' nlmadness.txt 
10yes line 1 
10yes line 4 

" ord($ 1)"表达式意味着将$ 1,第一个匹配从一个字符转换为数字编码。在我的系统上,这是UTF-8,换行符与十进制十进行匹配

$。是行号

答案 1 :(得分:3)

要仅在Notepad ++中匹配\n之前没有;的{​​{1}},您可以使用

\n(?<!;\n)

(?<!;)\n

请参阅regex demo

(?<!...)是一个后视零宽度断言,它会检查但不会消耗之前我们匹配的文本之前的文本( \n符号)。您尝试了预测,在匹配的文本后正确检查文本。

Vim中的相同构造是\(....\)\@<!

\n\(;\n\)\@<!

\(;\)\@<!\n

答案 2 :(得分:1)

将它绑定到开头和结尾:

^(.*[^;]{1})$
# match everything from star to end (^ to $)
# the last character MUST NOT be a semicolon
# save the whole string in a capturing group

请参阅a demo here on regex101.com