wow! creative! i think i can modify this for the general case. Thanks oznur
----- Original Message ----- From: "Rob Dixon" <[EMAIL PROTECTED]> To: "Öznur taştan" <[EMAIL PROTECTED]> Sent: Sunday, February 15, 2004 2:52 PM Subject: Re: all matches of a regex > Öznur tastan wrote: > > > > Hi, > > I have been trying to solve a problem which is about to drive me crazy. > > May be some one know the answer(hopefully:) > > > > I want to get all macthes of a pattern in a string including the overlaping ones. > > For example > > the string is "xHxxHyyKzDt" > > and the pattern is /^(.*)H(.*)K(.*)D(.*)$/ > > > > so in one round of match $1=x $2=xxHyy $3=z $4=t > > in another $1=xHxx $2=yy $3=x $4=t > > > > > > while ($sequence=~/$pattern/g ) > > doesn't work I think becaue the matches are overlapping > > > > while ($sequence=~/(?=$pattern)/g ) > > also doesn't work > > > > Hi Öznur. > > The problem is that wildcards in regexes will match either the maximum > number of characters for a match to work (.*) or the mimumum (.*?) and > nothing in between. The only way I can think of to do this is to > put an explicit count on your first field and try all possible values, > like the program below. Others are likely to come up with something > neater. > > HTH, > > Rob > > > > use strict; > use warnings;; > > my $sequence = 'xHxxHyyKzDt'; > > foreach my $n (1 .. length $sequence) { > > next unless $sequence =~ /^(.{$n})H(.+)K(.+)D(.+)/; > > printf "\$1 = %-6s", $1; > printf "\$2 = %-6s", $2; > printf "\$3 = %-6s", $3; > printf "\$4 = %-6s", $4; > print "\n\n"; > } > > **OUTPUT > > $1 = x $2 = xxHyy $3 = z $4 = t > > $1 = xHxx $2 = yy $3 = z $4 = t > > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>