我有一个很大的文件,其中包含以下行:

NO BIOMETRICS: 2000 ARIZONA/PHOENIX[1] {ARIZONA_PHOENIX_1_} AI
NO BIOMETRICS: 2090 ARIZONA/PHOENIX[2] {ARIZONA_PHOENIX_2_INTER} AB
NO BIOMETRICS: 900 TEXAS/DALLAS__1 {TEXAS_DALLAS_1_} NOCRIMINALHIST
NO BIOMETRICS: 0002 ALABAMA/HUNTSVILLE {ALABAMA/HUNTSVILLE} STATEPENITENTIARY

我只想在我的正则表达式与 ARIZONA 不匹配时打印

我正在使用以下代码来打印我正在处理的行中没有 ARIZONA 的所有情况
if($line =~ /(?!ARIZONA)/) {
 print $line,"\n";
}

但这似乎不起作用,它仍然会打印其中包含 ARIZONA 的行。

我究竟做错了什么?

谢谢。

最佳答案

如果当前位置后没有(?!ARIZONA),则ARIZONA匹配,因此,如果任何位置后没有/(?!ARIZONA)/,则/\A(?s:.*?)(?!ARIZONA)/(有效为ARIZONA)匹配。所有字符串都匹配,因为字符串的末尾永远不会跟随ARIZONA

您需要检查ARIZONA是否跟在所有位置之后。你要去

if ($line =~ /^(?:(?!ARIZONA).)*\z/s) {

你要
if ($line !~ /ARIZONA/) {

10-08 00:45