Let's start with a simple case, n = 1 and the charcter a. We want to match from the beginning of the string as many non-a characters as possible, and we know that we must only stop if we encounter an a :
$foo =~ /^([^a]*)a/;
Now let's look at an example of how we could do this for everything the second a. We can't use .* because we would then lose count. We can use .*?, but it won't help much. We will try to match as many non-a characters as possible before the first a, the first a and then again as many non-a characters, and then there must be the second a :
$foo =~ /^([^a]*a[^a]*)a/;
For three as, the RE will look like this :
$foo =~ /^([^a]*a[^a]*a[^a]*)a/;
and if we now look closely, we see a pattern [^a]*a which we can reuse with the Perl RE engine, as we must repeat that pattern n-1 times :
$m = $n -1; $foo =~ /^(([^a]*a){$m}[^a]*)a/;
Of course, as this pattern has to be recompiled every time we use it, we could as well use the above, unlooped pattern to match.
Update: 20020409 : Fixed small but important typo in the last line of code.$foo =~ /^(([^a]*a){m}[^a]*)a/; obviously won't match $m times...
perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web
In reply to Re: match n EMth/EM occurence
by Corion
in thread match n EMth/EM occurence
by arindamm
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |