【问题标题】:How to find out the starting point for each match in ruby如何在红宝石中找出每场比赛的起点
【发布时间】:2013-06-15 16:11:57
【问题描述】:

说,我有以下字符串

string = "#Sachin is Indian cricketer. #Tendulkar is right hand batsman. #Sachin has been honoured with the Padma Vibhushan award "

我想要 o/p 为

"#Sachin|0|7;#Tendulkar|29|10;#Sachinn|63|7;"

我试过了

 new_string = ""
 string.scan(/#\S+/).each{|match| new_string+="#{match}|#{string.index(match)}|#{match.length};"  }

这给了我

 "#Sachin|0|7;#Tendulkar|29|10;#Sachin|0|7;" 

那么我将如何获得每个子字符串的起始索引?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 string hashtag


    【解决方案1】:

    这实际上是一项非常重要的任务,并且已经在其他关于 SO 的问题中进行了相当多的讨论。这是最常见的解决方案:

    string = "#Sachin is Indian cricketer. #Tendulkar is right hand batsman. #Sachin has been honoured with the Padma Vibhushan award "
    new_string = string.to_enum(:scan,/#\S+/i).inject(''){|s,m| s + "#{m}|#{$`.size}|#{m.length};"}
    

    【讨论】:

    • +1 并删除了我的答案 :) 您可以使用注入使您的解决方案更加简单 - string.to_enum(:scan,/#\S+/i).inject('') { |s,米| s + "#{m}|#{$`.size}|#{m.length};" }
    • 不确定它是否有助于阅读,但无论如何它都相当难以辨认,所以我已经更新了:)。谢谢。
    【解决方案2】:

    基于此线程 How do I get the match data for all occurrences of a Ruby regular expression in a string? 只是简单示例:

    string = "#Sachin is Indian cricketer. #Tendulkar is right hand batsman. #Sachin has been honoured with the Padma Vibhushan award "
    new_string = ""
    string
      .to_enum(:scan, /#\S+/)
      .each do |wrd|
        m = Regexp.last_match
        new_string += "#{wrd}|#{m.offset(0)[0]}|#{wrd.length};"
      end
    p new_string
    

    【讨论】:

      【解决方案3】:

      这是使用扫描的一个:

      offset = 0
      string.scan(/(#\S*)([^#]*)/).map{|m| v = "#{m[0]}|#{offset}|#{m[0].length};"; offset += m.join.length; v}.join
      #=> "#Sachin|0|7;#Tendulkar|29|10;#Sachin|63|7;"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-09
        • 1970-01-01
        • 2011-05-10
        • 2012-08-30
        • 2016-08-07
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多