2015-07-10 75 views
0

给定一个字符串和一个整数n,我想删除第n次出现后以“#”开头的所有单词。删除以'#'开头的单词,除了前n个这样的单词外

例如,如果n = 2和字符串是:

“的#Chamonix法国的山是著名的滑雪,高山攀爬,碱跳跃,#Paragliding,生冒险和。第一个冬季奥运会的#Home这是一个探险家和摄影爱好者的天堂在这里看,#Druis的长时间曝光,一个多后发制人”

的那么结果应该是:

“山脉#Chamonix法国是着名的滑雪,高山攀登,跳台滑雪,#滑翔,原始冒险和第一届冬季奥运会。这是一个冒险家和摄影师的天堂。看到这里,长见识的,许多引人注目的”

前两个#-prefixed话,#Chamonix#Paragliding之一,被保存下来,但其余#-prefixed话,#Home#Druis,被拆除。

+1

问题不明,请重新配制。现在,它看起来好像你想从字符串中取出数字'2',并从结尾删除2'#...'s。 –

+1

哪些单词是相同的单词? – sawa

回答

5

如果要删除所有单词开始"#"第n次出现后,则:

string.gsub(/#\w+/).with_index(1){|s, i| i > n ? "" : s} 
+2

人们经常不会看到'gsub'返回一个枚举器。它的实用性的好例子。 –

-1

如果我得到你的问题的权利,你要n后删除所有哈希标签的话你可以像这样做:

str = "The mountains of #Chamonix France are famous for skiing, alpine climbing, base-jumping, #Paragliding, raw adventure and #Home of the first Winter Olympics. It's an adventurers and photographers paradise. Seen here, a long exposure of the #Druis, one of many striking" 
n = 2 

str.gsub(/#{str.scan(/#\w+/)[n..-1].join('|')}/,'') 
# => "The mountains of #Chamonix France are famous for skiing, alpine climbing, base-jumping, #Paragliding, raw adventure and of the first Winter Olympics. It's an adventurers and photographers paradise. Seen here, a long exposure of the , one of many striking" 

说明:

首先我们得到了所有的哈希标签的话:

str.scan(/#\w+/) 
# => ["#Chamonix", "#Paragliding", "#Home", "#Druis"] 

现在我们关心的第二个指标后唯一的话,即

str.scan(/#\w+/)[n..-1] # n is 2 
# => ["#Home", "#Druis"] 

现在,让我们创建一个正则表达式来查找字符串这些话。在这里:

/str.scan(/#\w+/)[n..-1].join('|')/ 
# /#Home|#Druis/ 

最后用gsub''替换它们。保持所有的东西放在一起,我们得到:

str.gsub(/#{str.scan(/#\w+/)[n..-1].join('|')}/,'') 
+0

假设你有'str =“#foo #bar #baz #foo”'。你的回答不仅会在开头删除最后的''#foo'',而且还会删除'#foo''。 – sawa

+1

啊,我明白了。你好,谢谢 – shivam

0

这应该工作(简单,易读的方式):

saved = 0 
str.split.map do |word| 
    ret = word 
    if word[0] == '#' 
    if saved == n 
     ret = '' 
    else 
     saved += 1 
    end 
    end 
    ret 
end.join 
0

你可以用String#gsub和一个正则表达式来做到这一点,如下所示。

str = "The #quick, brown #dog #jumped over #the #lazy fox" 
n = 2 # Number of words beginning with '#' to skip 

r =/
    (?:  # start a non-capture group 
    \#\w+ # match a word beginning with '#' 
    [^#]+ # match all characters other than '#' 
    )  # end the non-capture group 
    {#{n}}? # do that n times, lazily 
    \K  # disregard everything matched so far 
    \#\w+ # match a word beginning with '#' 
    /x  # extended mode 

str.gsub(r,'') 
    #=> "The #quick, brown #dog over fox"