From: Robert Citek <[EMAIL PROTECTED]>
> Is there an equivalent for "index" that uses regular expressions
> instead of exact string?
>
> I've been looking at index, pos, m//, and the corresponding "$"
> variables but nothing I've found so far does what I'm looking for.
> Specifically, what I'm trying to do is find all the starting locations
> of a RE match. For example, using an exact string match:
>
> $ perl -e '$foo="baaaab"; $re="aa" ;
> for ($bar=index($foo, $re); $bar >= 0 ; $bar=index($foo,
> $re, $bar+1))
> { print $bar, "\t" }
> print "\n" ; '
> 1 2 3
>
> I'd like to do the same except use a regular expression. BTW, notice
> that matches can overlap.
>
> Any thoughts or ideas?
How about this:
$s = "sasas dfgfgh asasas asedsase";
while ($s =~ /\G.*?(?=sas)./g) {
print "pos=",pos($s)-1, " = '",substr($s,pos($s)-1,3),"'\n";
}
the "sas" is the regexp being matched.
The \G matches where the last match left off, the .*? skips as few
characters as possible, the (?=) makes sure the regexp matches at
that place, but doesn't move the position in string and the . at the
end moves the position so that the next round doesn't find the same
occurrence. That's also why I have to subtrct the 1 from the pos($s).
You could also do this:
while ($s =~ /\G.+?(?=sas)/g) {
print "pos=",pos($s), " = '",substr($s,pos($s),3),"'\n";
}
Which looks a bit nicer, but it would miss the match at the very
beginning of the string.
HTH, Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed
to get drunk and croon as much as they like.
-- Terry Pratchett in Sourcery
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>