Я предполагаю, что мы хотим потерпеть неудачу с теми, которые имеют FAILNAME
, с которым ваше оригинальное выражение работает нормально, и затем мы немного изменим это, что может сработать:
^(?=The\sfile\s)(?!.*\s\bFAILNAME\b\s.*).*$
Здесь мы добавляем два пробела в качестве дополнительных левой и правой границ, которые, если мы не хотим их иметь, мы бы просто исключили.
Пример
use strict;
my $str = 'The file FILENAME has not been received
The file FILENAME has been received
The file FILENAME
The file AFAILNAME has not been received
FILENAME
The file FAILNAME has not been received
FAILNAME has not been received
The file FAILNAME
';
my $regex = qr/^(?=The\sfile\s)(?!.*\s\bFAILNAME\b\s.*).*$/mp;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
RegEx Circuit
jex.im визуализирует регулярные выражения: