2015-07-10 157 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" 
相關問題