Hi, new questions go in Seekers Of Perl Wisdom because
Roy Johnson, whom you asked a question, hasn't been here in 6 weeks.
You used code tags and put your code in between, that is awesome :)
Welcome, see How do I post a question effectively?, Where should I post X?
The regex which is not working for you, contains A zero-width negative look-ahead assertion, and like perlre#(?!pattern) says
A zero-width negative look-ahead assertion. For example /foo(?!bar)/
matches any occurrence of "foo" that isn't followed by "bar". Note
however that look-ahead and look-behind are NOT the same thing. You cannot
use this for look-behind.
If you are looking for a "bar" that isn't preceded by a "foo", /(?!foo)bar/
will not do what you want. That's because the (?!foo) is just saying that
the next thing cannot be "foo"--and it's not, it's a "bar", so "foobar" will
match. Use look-behind instead (see below).
So, use a look-behind
But, that probably won't work either, because you can't have variable length length lookbehind , so you need to use a fixed width lookbehind.
#!/usr/bin/perl --
use strict; use warnings;
use Test::More qw' no_plan ';
Main(@ARGV);
exit(0);
sub Main {
my @yesWant = (
'equity, private equity',
'equity',
'private equity,equity',
'private equity, equity',
'equity,private equity',
);
my @notWant = (
'private equity',
'private equity',
'mutual funds',
'cds',
);
for my $not ( @notWant ){
ok( (not TestEquity($not)), "not '$not'" );
}
for my $yes ( @yesWant ){
ok( TestEquity($yes), "yes '$yes'" );
}
}
sub TestEquity {
return 1 if $_[0] =~ m/(?<!private\s)equity/;
return 0;
}
__END__
$ prove -v pm911357.lookbehind.pl
pm911357.lookbehind.pl ..
ok 1 - not 'private equity'
ok 2 - not 'private equity'
ok 3 - not 'mutual funds'
ok 4 - not 'cds'
ok 5 - yes 'equity, private equity'
ok 6 - yes 'equity'
ok 7 - yes 'private equity,equity'
ok 8 - yes 'private equity, equity'
ok 9 - yes 'equity,private equity'
1..9
ok
All tests successful.
Files=1, Tests=9, 0 wallclock secs ( 0.06 usr + 0.01 sys = 0.08 CPU
+)
Result: PASS
If fixed width lookbehind doesn't work for you, simply do TWO tests
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.