How to find the position of each match within a string


#1

Hi all,

I have a small script to find a match. If a match is found I need to
print its position within the string. I try the String#index but it only
returns the first match. Any idea?

Thanks,

Li

C:\Documents and Settings\chen73\My Documents\Ruby\bin>irb
irb(main):001:0> “ello-hello”.scan(‘e’) do |match|
irb(main):002:1* p “ello-hello”.index(match)
irb(main):003:1> end
0
0
=> “ello-hello”
irb(main):004:0>


#2

Hi –

On Sun, 25 Jan 2009, Li Chen wrote:

C:\Documents and Settings\chen73\My Documents\Ruby\bin>irb
irb(main):001:0> “ello-hello”.scan(‘e’) do |match|
irb(main):002:1* p “ello-hello”.index(match)
irb(main):003:1> end
0
0
=> “ello-hello”

You can examine the $~ global MatchData object, in a couple of ways:

irb(main):003:0> “ello-hello”.scan(‘e’) do |match|
irb(main):004:1* p $~.pre_match.size
irb(main):005:1> end
0
6
=> “ello-hello”
irb(main):006:0> “ello-hello”.scan(‘e’) do |match|
irb(main):007:1* p $~.offset(0)[0]
irb(main):008:1> end
0
6
=> "ello-hello

(And there may be more I’m not thinking of.)

David


David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2)

http://www.wishsight.com => Independent, social wishlist management!


#3

You can examine the $~ global MatchData object, in a couple of ways:

irb(main):003:0> “ello-hello”.scan(‘e’) do |match|
irb(main):004:1* p $~.pre_match.size
irb(main):005:1> end
0
6

Interesting. Does that mean that String#scan() converts a String
argument to RegExp?


#4

Radosław Bułat wrote:

You can examine the $~ global MatchData object, in a couple of ways:

irb(main):003:0> “ello-hello”.scan(‘e’) do |match|
irb(main):004:1* p $~.pre_match.size
irb(main):005:1> end
0
6

Interesting. Does that mean that String#scan() converts a String
argument to RegExp?

Yes it does, even if it search fixed-size string.

I’m shocked. Why does it do this? (this conversion)

And doesn’t this mean that #scan is less efficient than it could have
been? Isn’t matching regexps slower than matching plain strings?


#5

On Sun, Jan 25, 2009 at 12:31 AM, Albert S. removed_email_address@domain.invalid
wrote:

You can examine the $~ global MatchData object, in a couple of ways:

irb(main):003:0> “ello-hello”.scan(‘e’) do |match|
irb(main):004:1* p $~.pre_match.size
irb(main):005:1> end
0
6

Interesting. Does that mean that String#scan() converts a String
argument to RegExp?

Yes it does, even if it search fixed-size string.


Pozdrawiam

Rados³aw Bu³at
http://radarek.jogger.pl - mój blog


#6

David A. Black wrote:

You can examine the $~ global MatchData object, in a couple of ways:

irb(main):003:0> “ello-hello”.scan(‘e’) do |match|
irb(main):004:1* p $~.pre_match.size
irb(main):005:1> end
0
6
=> “ello-hello”
irb(main):006:0> “ello-hello”.scan(‘e’) do |match|
irb(main):007:1* p $~.offset(0)[0]
irb(main):008:1> end
0
6
=> "ello-hello

Hi David,

Thanks.

I go back and read the chapter about MatchData. And it helps me a lot.

Li