in reply to Negating a regexp
/(?:(?!$re).)*/
is the equivalent of
/[^$chars]*/
but it can (negatively) match entire regexps instead of a choice of characters. Keep in mind that both expressions can sucessfully match 0 characters if not properly anchored.
s/(.*ing)(?:(?!bob|fred|bill).)*(more)/\1HIT\2/;
Update:
You may want
"something that isn't /bob|fred|bill/"
rather than
"something that doesn't contain /bob|fred|bill/".
The code for that would be:
s/ (.*ing) (?: .{0,2} | (?!bob).{3} | (?!fred|bill).{4} | .{5,} ) (more) /\1HIT\2/x;
or
my %bad_words = map { $_ => 1 } qw( bob fred bill ); s/ (.*ing) (.*) (?(?{ $bad_words{$2} })\A(?!\A)) (more) /\1HIT\3/x;
You could simplify the above to
s/(.*ing)(?!bob|fred|bill).*(more)/\1HIT\2/;
but only if the start of more can't match the end of bob, fred or bill.
|
|---|