Reputation: 437
I'm trying to match a string (using a Perl regex) only if it doesn't start with "abc:" or "defg:", but I can't seem to find out how. I've tried something like
^(?:(?!abc:)|(?!defg:))
Upvotes: 30
Views: 21915
Reputation: 1153
Lookahead (?=foo)
, (?!foo)
and lookbehind (?<=foo)
, (?<!foo)
do not consume any characters.
You can do multiple assertions:
^(?!abc:)(?!defg:)
or:
^(?!defg:)(?!abc:)
...and the order does not make a difference.
You can use De Morgan (as other answers do):
(NOT A) AND (NOT B) <=> NOT (A OR B)
...and shorten the expression to:
^(?!abc:|defg:)
Upvotes: 40
Reputation: 43
Use this regex:
^(?!abc:|defg:)\s*\w+
This will avoid line start with "abc:" and "defg:" as you want.
Upvotes: 2
Reputation: 67968
^(?:(?!abc:|defg:).)*$
Try this. See the demo at http://regex101.com/r/hQ9xT1/18.
Upvotes: 0
Reputation: 2393
… or we could have dropped the alternation from the original expression:
^(?:(?!abc:)(?!defg:))
Upvotes: 1
Reputation: 2589
Could you please try this:
use strict;
use warnings;
use Cwd;
while(<DATA>)
{
my $line=$_;
print $line unless($line=~m/^(abc|defg*)/m);
}
__DATA__
ebc this is testing ebc
dbc this is testing dbc
defg this is testing defg
abc this is testing abc
defg this is testing defg
Upvotes: 0