2013-06-19 100 views
1

说每场比赛的起点,我有以下字符串如何找出红宝石

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

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

回答

3

这实际上是相当不平凡的任务,并且在其他关于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

+1并删除了我的答案:)你可以通过注入string.to_enum(:scan,/#\ S +/i).inject(''){| s,m | s +“#{m} |#{$'.size} |#{m.length};” } – trushkevich

+0

不知道它有助于阅读,但无论如何它是相当难以辨认,所以我已经更新:)。谢谢。 –

1

下面是一个使用扫描:

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