How to find multiple matches in a string

Discussion in 'Ruby' started by Alex DeCaria, Apr 13, 2010.

  1. Alex DeCaria

    Alex DeCaria Guest

    I know how to use regular expressions to find the first match of a
    pattern in a string. But, how do I most easily find multiple matches?
    For example, if the string is

    s = 'abcde_abcde_abcde'

    and I want to find the location of ALL the 'b' characters, how do I do
    it? If I use

    m = s.match(/b/)

    then m.offset(0) => [1,2]

    but I don't have any information about the second or third occurences of
    'b'.

    --Alex
    --
    Posted via http://www.ruby-forum.com/.
    Alex DeCaria, Apr 13, 2010
    #1
    1. Advertising

  2. Hei,

    s = 'abcde_abcde_abcde'
    m = s.scan(/b/)
    p m # ['b','b','b']

    HTH

    --
    Andrea Dallera
    http://github.com/bolthar/freightrain
    http://usingimho.wordpress.com


    On Wed, 2010-04-14 at 01:51 +0900, Alex DeCaria wrote:
    > I know how to use regular expressions to find the first match of a
    > pattern in a string. But, how do I most easily find multiple matches?
    > For example, if the string is
    >
    > s = 'abcde_abcde_abcde'
    >
    > and I want to find the location of ALL the 'b' characters, how do I do
    > it? If I use
    >
    > m = s.match(/b/)
    >
    > then m.offset(0) => [1,2]
    >
    > but I don't have any information about the second or third occurences of
    > 'b'.
    >
    > --Alex
    Andrea Dallera, Apr 13, 2010
    #2
    1. Advertising

  3. Alex DeCaria

    Intransition Guest

    On Apr 13, 12:51=A0pm, Alex DeCaria <>
    wrote:
    > I know how to use regular expressions to find the first match of a
    > pattern in a string. =A0But, how do I most easily find multiple matches?
    > For example, if the string is
    >
    > s =3D 'abcde_abcde_abcde'
    >
    > and I want to find the location of ALL the 'b' characters, how do I do
    > it?


    Try #scan
    Intransition, Apr 13, 2010
    #3
  4. On 04/13/2010 06:55 PM, Andrea Dallera wrote:
    > Hei,
    >
    > s = 'abcde_abcde_abcde'
    > m = s.scan(/b/)
    > p m # ['b','b','b']


    Or even

    s.scan(/b) {|match| p match}

    Kind regards

    robert

    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, Apr 13, 2010
    #4
  5. Alex DeCaria

    Alex DeCaria Guest

    Alex DeCaria, Apr 13, 2010
    #5
  6. On Tue, Apr 13, 2010 at 7:01 PM, Alex DeCaria
    <> wrote:
    > Andrea Dallera wrote:
    >> Hei,
    >>
    >> =A0 s =3D 'abcde_abcde_abcde'
    >> =A0 m =3D s.scan(/b/)
    >> =A0 p m # ['b','b','b']
    >>
    >> HTH
    >>
    >> --
    >> Andrea Dallera
    >> http://github.com/bolthar/freightrain
    >> http://usingimho.wordpress.com

    >
    > Thanks Andrea. =A0But is there a way to also find the locations (indexes)
    > of the 'b' characters?


    Take a look at this thread, maybe you can get some ideas:

    http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/337667

    Jesus.
    Jesús Gabriel y Galán, Apr 13, 2010
    #6
  7. string = "abcde abcde abcde"
    sum = 0
    result = []
    blocks = string.split(/b/)
    blocks.pop
    blocks.each do |block|
    sum += block.length
    result << sum
    sum += 1
    end
    p result # [1,7,13]

    Don't tell anyone I've written this crap :)

    --
    Andrea Dallera
    http://github.com/bolthar/freightrain
    http://usingimho.wordpress.com


    On Wed, 2010-04-14 at 02:01 +0900, Alex DeCaria wrote:
    > Andrea Dallera wrote:
    > > Hei,
    > >
    > > s = 'abcde_abcde_abcde'
    > > m = s.scan(/b/)
    > > p m # ['b','b','b']
    > >
    > > HTH
    > >
    > > --
    > > Andrea Dallera
    > > http://github.com/bolthar/freightrain
    > > http://usingimho.wordpress.com

    >
    > Thanks Andrea. But is there a way to also find the locations (indexes)
    > of the 'b' characters?
    >
    > --Alex
    Andrea Dallera, Apr 13, 2010
    #7
  8. On 4/13/10, Alex DeCaria <> wrote:
    > Andrea Dallera wrote:
    >> Hei,
    >>
    >> s = 'abcde_abcde_abcde'
    >> m = s.scan(/b/)
    >> p m # ['b','b','b']
    >>
    >> HTH

    >
    > Thanks Andrea. But is there a way to also find the locations (indexes)
    > of the 'b' characters?


    I think this works:

    s = 'abcde_abcde_abcde'
    i=0
    while i=s.index('b',i)
    do_something_with i
    end
    Caleb Clausen, Apr 13, 2010
    #8
  9. Andrea Dallera, Apr 13, 2010
    #9
  10. Alex DeCaria

    botp Guest

    On Wed, Apr 14, 2010 at 1:32 AM, Andrea Dallera
    <> wrote:
    > Nope, tried it.
    >
    > --
    > Andrea Dallera
    > http://github.com/bolthar/freightrain
    > http://usingimho.wordpress.com
    >
    >
    > On Wed, 2010-04-14 at 02:27 +0900, Caleb Clausen wrote:
    >> s =3D 'abcde_abcde_abcde'
    >> =A0 i=3D0
    >> =A0 while i=3Ds.index('b',i)
    >> =A0 =A0 =A0do_something_with i
    >> =A0 end

    >


    what do you mean it does not work?

    btw, you can also use stringscan. it's fast.

    > s=3DStringScanner.new "this is a test string"

    =3D> #<StringScanner 0/21 @ "this ...">

    > p s.pos while s.scan_until /s/

    4
    7
    13
    16
    =3D> nil


    pls do not top post.

    kind regards -botp
    botp, Apr 13, 2010
    #10
  11. On 13.04.2010 19:01, Alex DeCaria wrote:
    > Andrea Dallera wrote:
    >> Hei,
    >>
    >> s = 'abcde_abcde_abcde'
    >> m = s.scan(/b/)
    >> p m # ['b','b','b']


    > Thanks Andrea. But is there a way to also find the locations (indexes)
    > of the 'b' characters?


    irb(main):012:0> s="a "*5
    => "a a a a a "
    irb(main):013:0> s.scan(/a+/) { p $~, $~.offset(0) }
    #<MatchData "a">
    [0, 1]
    #<MatchData "a">
    [2, 3]
    #<MatchData "a">
    [4, 5]
    #<MatchData "a">
    [6, 7]
    #<MatchData "a">
    [8, 9]
    => "a a a a a "
    irb(main):014:0>

    Kind regards

    robert

    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, Apr 14, 2010
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jeff Kish
    Replies:
    2
    Views:
    335
    David Hilsee
    Jul 23, 2004
  2. Andy
    Replies:
    9
    Views:
    361
    Peter Otten
    Nov 24, 2006
  3. Aaron Scott
    Replies:
    7
    Views:
    362
    alex23
    Dec 2, 2008
  4. Jochen Brenzlinger
    Replies:
    5
    Views:
    676
    Daniel Pitts
    Nov 21, 2011
  5. BrendanC
    Replies:
    8
    Views:
    183
    Brian Candler
    Jul 18, 2009
Loading...

Share This Page