Forum: Ruby reg exp

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Bf7ae4d3ada1ba5b5ac332ff6875e1a6?d=identicon&s=25 Hai anh Le (dikdikdik)
on 2008-11-27 15:33
Hi every body. I'm a newbie in Ruby and have problem with reg exp.

In one string as example "The device 13c include something as in Fig. 2a
and 3b", I want to detect some numbers have style "13c" and ignore
others number have style "2a and 3b"

I use /(\d+[a-z]*)( [^a][^n][^d] )(\d)+[a-z]*/ but it not ok. Can
someone help me plz?
B14575f0ca69f10938fdd67e7156e0e1?d=identicon&s=25 Craig Demyanovich (Guest)
on 2008-11-27 15:45
(Received via mailing list)
It would be helpful if you would share several examples of patterns that
you
want to match and patterns that you want to exclude. Also,
http://www.rubular.com is a great place for experimenting with regular
expressions in Ruby.

Regards,
Craig
753dcb78b3a3651127665da4bed3c782?d=identicon&s=25 Brian Candler (candlerb)
on 2008-11-27 15:49
Hai anh Le wrote:
> Hi every body. I'm a newbie in Ruby and have problem with reg exp.
>
> In one string as example "The device 13c include something as in Fig. 2a
> and 3b", I want to detect some numbers have style "13c" and ignore
> others number have style "2a and 3b"
>
> I use /(\d+[a-z]*)( [^a][^n][^d] )(\d)+[a-z]*/ but it not ok. Can
> someone help me plz?

Tricky. I suggest:

  str.scan(/\d+[a-z]?(?: and \d+[a-z]?)?/).reject { |e| /and/ =~ e }

I thought about lookahead assertions, e.g. (?! and \d+), but since these
don't consume characters the 3b is likely to be matched later as a
standalone number.

Details at http://www.ruby-doc.org/docs/ProgrammingRuby/ - click on "The
Ruby Language" in the contents, and scroll down to Extensions.
Bf7ae4d3ada1ba5b5ac332ff6875e1a6?d=identicon&s=25 Hai anh Le (dikdikdik)
on 2008-11-27 16:29
Brian Candler wrote:
> Hai anh Le wrote:
>> Hi every body. I'm a newbie in Ruby and have problem with reg exp.
>>
>> In one string as example "The device 13c include something as in Fig. 2a
>> and 3b", I want to detect some numbers have style "13c" and ignore
>> others number have style "2a and 3b"
>>
>> I use /(\d+[a-z]*)( [^a][^n][^d] )(\d)+[a-z]*/ but it not ok. Can
>> someone help me plz?
>
> Tricky. I suggest:
>
>   str.scan(/\d+[a-z]?(?: and \d+[a-z]?)?/).reject { |e| /and/ =~ e }
>
> I thought about lookahead assertions, e.g. (?! and \d+), but since these
> don't consume characters the 3b is likely to be matched later as a
> standalone number.
>
> Details at http://www.ruby-doc.org/docs/ProgrammingRuby/ - click on "The
> Ruby Language" in the contents, and scroll down to Extensions.

Hi Brian!

I have another example as:

"The coefficients are then mixed with the data from mixer 51xy, so that
the recording equipment 14abc stores the six channel data stream, the
scripting data 26aa and 27ac"

My purpose is to find the position of number have style "123abc", after
that I get the string from begin to that position like "The coefficients
are then mixed with the data from mixer 51xy,"
Then I will continued search...

My code like

while string.size do
if string=~ /.../ then
  temp_string = $` + $&
  string.gsub!(temp_string, "")
else
  break
end


So that what I need is $& = "123abc" and not = "123abc and 123abc"
753dcb78b3a3651127665da4bed3c782?d=identicon&s=25 Brian Candler (candlerb)
on 2008-11-27 18:00
Hai anh Le wrote:
> I have another example as:
>
> "The coefficients are then mixed with the data from mixer 51xy, so that
> the recording equipment 14abc stores the six channel data stream, the
> scripting data 26aa and 27ac"
>
> My purpose is to find the position of number have style "123abc", after
> that I get the string from begin to that position like "The coefficients
> are then mixed with the data from mixer 51xy,"
> Then I will continued search...
>
> My code like
>
> while string.size do
> if string=~ /.../ then
>   temp_string = $` + $&
>   string.gsub!(temp_string, "")
> else
>   break
> end
>
>
> So that what I need is $& = "123abc" and not = "123abc and 123abc"

Sorry - that still does not make it clear what you want, especially with
the portion of the string " ... the scripting data 26aa and 27ac"

Here is some code:

str = <<EOS
The coefficients are then mixed with the data from mixer 51xy, so that
the recording equipment 14abc stores the six channel data stream, the
scripting data 26aa and 27ac
EOS

p str.scan(/.*?\d+[a-z]*/m)

# ["The coefficients are then mixed with the data from mixer 51xy", ",
so that \nthe recording equipment 14abc", " stores the six channel data
stream, the \nscripting data 26aa", " and 27ac"]

If you want to keep 26aa but not 27ac, then use reject to strip out the
match " and 27ac".

Here is another option:

p str.scan(/.*?\d+[a-z]*(?: and \d+[a-z]*)?/m)

# ["The coefficients are then mixed with the data from mixer 51xy", ",
so that \nthe recording equipment 14abc", " stores the six channel data
stream, the \nscripting data 26aa and 27ac"]

This time the whole clause up to an including 26aa and 27ac is a
separate item, and you can strip this out using reject.
Bf7ae4d3ada1ba5b5ac332ff6875e1a6?d=identicon&s=25 Hai anh Le (dikdikdik)
on 2008-11-28 02:34
 p str.scan(/.*?\d+[a-z]*(?: and \d+[a-z]*)?/m)

 # ["The coefficients are then mixed with the data from mixer 51xy", ",
 so that the recording equipment 14abc", " stores the six channel data
 stream, the scripting data 26aa and 27ac"]

yes, it is all thing  I want. Thank you very much
This topic is locked and can not be replied to.