Regex 零宽度负前瞻断言

Regex 零宽度负前瞻断言,regex,perl,Regex,Perl,我有以下文本保存在一个文件,并试图做正则表达式 line1 brown fox line2 black owl line3 red dear 当我尝试运行以下perl命令时 perl -ne 'print if /(line.*)(?!.*fox)/' text.txt 它正在打印所有三行(而不是打印第2行和第3行)。 这和第一行如何匹配?如果我使用下面的perl语句,我会得到预期的结果 perl -ne 'print if /(line)(?!.*fox)/' text.txt 感谢所有

我有以下文本保存在一个文件,并试图做正则表达式

line1 brown fox
line2 black owl
line3 red dear
当我尝试运行以下perl命令时

perl -ne 'print if /(line.*)(?!.*fox)/' text.txt
它正在打印所有三行(而不是打印第2行和第3行)。
这和第一行如何匹配?如果我使用下面的perl语句,我会得到预期的结果

perl -ne 'print if /(line)(?!.*fox)/' text.txt

感谢

所有三个字符串都成功匹配,因为前面的*贪婪地匹配了每个字符,并吞噬了整个字符串。然后,引擎将继续尝试断言字符串中的内容不是“foo”;回溯到lookahead中的
*
并贪婪地重复,直到它在字符串位置的末尾断言

将前视置于字符串的开头,以断言在当前位置,后面的不是“fox”。如果前瞻成功,引擎将继续匹配

perl -ne 'print if /^(?!.*fox).*/' text.txt

上面的内容将向前看,看是否没有任何字符(新行除外)或“福克斯”。如果成功,则匹配任何字符(换行符除外),换言之,匹配整个字符串。

所有三个字符串都成功匹配,因为前瞻前面的
*
贪婪地匹配每一个字符并吞噬整个字符串。然后,引擎将继续尝试断言字符串中的内容不是“foo”;回溯到lookahead中的
*
并贪婪地重复,直到它在字符串位置的末尾断言

将前视置于字符串的开头,以断言在当前位置,后面的不是“fox”。如果前瞻成功,引擎将继续匹配

perl -ne 'print if /^(?!.*fox).*/' text.txt

上面的内容将向前看,看是否没有任何字符(新行除外)或“福克斯”。如果成功,则匹配任何字符(换行符除外),换言之,匹配整个字符串。

Ok If line*。在尝试lookahead之前使用整个字符串,那么为什么下面的语句返回正确的结果perl-ne'print if/(line.*)(?=.*fox)/'text.txt…当这个语句我只得到第1行时。因为正则表达式引擎会找到匹配的方法。您最初的尝试排除了一个可能的匹配,但引擎只找到了另一个。相反,如果有一行,此解决方案会在负前瞻中找到匹配项。@hwnd:(line.*)匹配所有三行并将每一行视为一个完整字符串是有意义的,但是如果我将负前瞻替换为正前瞻,则不会给出预期的结果……因此,如果我使用以下脚本perl-ne'print if/(line.*)(?!*fox)/;打印“$1\n”test3.txt line1棕色fox line1棕色fox line2黑色猫头鹰line2黑色猫头鹰line3红色亲爱的line3红色亲爱的,然后打印第一组($1)显示整行与(line.*)匹配如上面的输出所示。@hwnd:但如果我在同一脚本中使用正向前瞻,打印第一个组会得到不同的结果perl-ne'print if/(line.*)(?=.*fox)/;print“$1\n”'test3.txt line1 brown fox line1 brown line1 brown line1 brown line1 brown Now(line.*)未将整行视为一个完整字符串。更改第二组(+ve lookahead vs-ve lookahead)对第一组(line.*)有何影响匹配?默认情况下,
不跨换行符。使用正向前瞻
(?=…)
只匹配第一行,因为它包含单词fox。如果行*。在尝试前瞻之前消耗了整个字符串,那么为什么下面的语句返回正确的结果perl-ne'print if/(行*)(?=.*fox)/'text.txt….当这个语句出现时,我只得到第1行。因为正则表达式引擎会找到一种匹配的方法,如果有匹配的话。您最初的尝试排除了一种可能的匹配,但引擎只找到了另一种。相反,如果有匹配的话,这个解决方案会在负前瞻中找到匹配。@hwnd:(第.*行)匹配所有三行并将每一行视为一个完整字符串是有意义的,但如果我将负前瞻替换为正前瞻,则不会给出预期结果……因此,如果我使用以下脚本perl-ne'print if/(line.*)(?!*fox)/;print“$1\n”'test3.txt line1棕色fox line1棕色fox line2黑色猫头鹰line2黑色猫头鹰line3红色亲爱的line3红色亲爱的line3红色亲爱的然后打印第一组($1)显示整行与(line.*)匹配如上面的输出所示。@hwnd:但如果我在同一脚本中使用正向前瞻,打印第一个组会得到不同的结果perl-ne'print if/(line.*)(?=.*fox)/;print“$1\n”'test3.txt line1 brown fox line1 brown line1 brown line1 brown line1 brown Now(line.*)未将整行视为一个完整字符串。更改第二组(+ve lookahead vs-ve lookahead)对第一组(line.*)有何影响匹配?默认情况下,
不跨换行符。使用正向前瞻
(?=…)
只匹配第一行,因为它包含单词fox。