如何找出ruby中每场比赛的起点

说,我有一个跟随字符串

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

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

这实际上是一项非常重要的任务,并且在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};"} 

这是一个使用扫描:

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

基于此线程如何获取字符串中所有出现的Ruby正则表达式的匹配数据? 只是简单的例子:

 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