我想匹配换行符\ 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
答案 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