How to get indexes of all occurrences of a pattern in a string

前端 未结 2 420
梦如初夏
梦如初夏 2020-12-14 11:41
string = \"Jack and Jill went up the hill to fetch a pail of water. Jack fell down and broke his crown. And Jill came tumbling after. \"
d = string.match(/(jack|jill         


        
相关标签:
2条回答
  • 2020-12-14 11:55

    You can use .scan and $` global variable, which means The string to the left of the last successful match, but it doesn't work inside usual .scan, so you need this hack (stolen from this answer):

    string = "Jack and Jill went up the hill to fetch a pail of water. Jack fell down and broke his crown. And Jill came tumbling after. "  
    string.to_enum(:scan, /(jack|jill)/i).map do |m,|
      p [$`.size, m]
    end
    

    output:

    [0, "Jack"]
    [9, "Jill"]
    [57, "Jack"]
    [97, "Jill"]
    

    UPD:

    Note the behaviour of lookbehind – you get the index of the really matched part, not the look one:

    irb> "ab".to_enum(:scan, /ab/     ).map{ |m,| [$`.size, $~.begin(0), m] }
    => [[0, 0, "ab"]]
    irb> "ab".to_enum(:scan, /(?<=a)b/).map{ |m,| [$`.size, $~.begin(0), m] }
    => [[1, 1, "b"]]
    
    0 讨论(0)
  • 2020-12-14 12:04

    Here's a modification of Nakilon's answer if you want to put just the locations of "Jack" into an array

    location_array = Array.new
    
    string = "Jack and Jack went up the hill to fetch a pail of Jack..."  
    string.to_enum(:scan,/(jack)/i).map do |m,|
        location_array.push [$`.size]
    end
    
    0 讨论(0)
提交回复
热议问题