【问题标题】:How to get indexes of all occurrences of a pattern in a string如何获取字符串中所有出现的模式的索引
【发布时间】:2018-02-22 12:47:14
【问题描述】:
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)/i) # -> MatchData "Jill" 1:"Jill"
d.size # -> 1

这只匹配它看起来的第一次出现。
string.scan 部分完成了这项工作,但它没有说明匹配模式的索引。

如何获取模式的所有匹配实例及其索引(位置)的列表?

【问题讨论】:

    标签: ruby regex position pattern-matching


    【解决方案1】:

    您可以使用.scan$` 全局变量,这意味着最后一次成功匹配左侧的字符串,但它在通常的.scan 中不起作用,所以你需要这个hack(从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
    

    输出:

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

    UPD:

    注意lookbehind的行为——你得到的是真正匹配部分的索引,而不是look

    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"]]
    

    【讨论】:

    • 如果你只想将 Jack 的位置放入一个数组中,这里有一个修改 loc_array = Array.new string = "Jack 和 Jill 上山去取一桶水。Jack 摔倒了打破了他的王冠。吉尔摔倒了。” string.to_enum(:scan,/(jack)/i).map do |m,| loc_array.push [$`.size] 结束
    【解决方案2】:

    如果您只想将“Jack”的位置放入数组中,这是对 Nakilon 答案的修改

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2012-11-15
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2019-12-10
      相关资源
      最近更新 更多