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>
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 (The Well-Grounded Rubyist)
http://www.wishsight.com => Independent, social wishlist management!
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?
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?
On Sun, Jan 25, 2009 at 12:31 AM, Albert S. [email protected]
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
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