Q: n-times matching


#1

Hi,

I wrote the following code, but I can’t get an expeceted result.
…===================== nmatch.rb ========
str = 'hogeratta’
while str =~ /<(/?\w+)>/ do
print $1, "\n"
end
…========================================

Expected output:
…----------------------------------------
$ ruby nmatch.rb
html
body
/body
/html
…----------------------------------------

Real output:
…----------------------------------------
% ruby nmatch.rb
html
html
html
… (infinite loop)
…----------------------------------------

Please tell me how to get what I expected.

regards,
makoto


(Nobuyoshi Nakada) #2

Hi,

I wrote the following code, but I can’t get an expeceted result.
…===================== nmatch.rb ========
str = 'hogeratta’
while str =~ /<(/?\w+)>/ do
print $1, "\n"
end
…========================================

It matches at same point everytime.

str.scan(/<(/?\w+)>/) do
print $1, "\n"
end

pos = 0
while pos = str.index(/<(/?\w+)>/, pos) do
print $1, "\n"
pos += $1.size
end

pos = 0
while str =~ /\A.{#{pos}}.*?<(/?\w+)>/ do
print $1, "\n"
pos = $&.size
end

···

At Mon, 17 Jun 2002 11:16:02 +0900, kwatch wrote:


Nobu Nakada


#3

Thank you very much, Nobu.

You showed three ways to make my desire.
Which is the fastest? Please tell me if you know it.

regards
kwatch

nobu.nokada@softhome.net wrote in message news:200206170318.g5H3Ib211677@sharui.nakada.kanuma.tochigi.jp

···

It matches at same point everytime.

str.scan(/<(/?\w+)>/) do
print $1, "\n"
end

pos = 0
while pos = str.index(/<(/?\w+)>/, pos) do
print $1, "\n"
pos += $1.size
end

pos = 0
while str =~ /\A.{#{pos}}.*?<(/?\w+)>/ do
print $1, "\n"
pos = $&.size
end


(Nobuyoshi Nakada) #4

Hi,

You showed three ways to make my desire.
Which is the fastest? Please tell me if you know it.

I ordered in faster first.

String#index needs to adjust multibyte alignment each time, and
it’s slow in 1.6. And the last example need to create new
Regexps each time.

And errata.

pos = 0
while pos = str.index(/<(/?\w+)>/, pos) do
while str.index(/<(/?\w+)>/, pos) do
print $1, "\n"
pos += $1.size
pos = $~.end(0)
end

pos = 0
while str =~ /\A.{#{pos}}.?<(/?\w+)>/ do
while str =~ /\A.{#{pos}}.
?<(/?\w+)>/m do
print $1, "\n"
pos = $&.size
pos = $~.end(0)

···

At Tue, 18 Jun 2002 04:37:11 +0900, kwatch wrote:

end


Nobu Nakada


#5

Thank you very much.
I adopt your first example.

regards,
kwatch

nobu.nokada@softhome.net wrote in message news:200206180254.g5I2sl227739@sharui.nakada.kanuma.tochigi.jp

···

Hi,

At Tue, 18 Jun 2002 04:37:11 +0900, > kwatch wrote:

You showed three ways to make my desire.
Which is the fastest? Please tell me if you know it.

I ordered in faster first.

String#index needs to adjust multibyte alignment each time, and
it’s slow in 1.6. And the last example need to create new
Regexps each time.

And errata.

pos = 0
while pos = str.index(/<(/?\w+)>/, pos) do
while str.index(/<(/?\w+)>/, pos) do
print $1, "\n"
pos += $1.size
pos = $~.end(0)
end

pos = 0
while str =~ /\A.{#{pos}}.?<(/?\w+)>/ do
while str =~ /\A.{#{pos}}.
?<(/?\w+)>/m do
print $1, "\n"
pos = $&.size
pos = $~.end(0)
end