2013-11-20 45 views
3

我正在尋找一種方法來搜索字符串中所有出現的模式,對返回的字符串執行一些非平凡的操作,然後代替它。Ruby:查找所有出現的字符串中的模式,操作並替換

Ruby的String#gsub!方法不太合適,因爲我需要接收返回的出現,然後操作它以提供將用於替換它的值。

Ruby的String#scan方法當然可以用來查找所有出現的模式,但是我不知道如何在我對它們進行必要的更改後替換返回的出現。

下面的代碼示例並不是我實際上正在處理的內容,它演示了我試圖完成的事情。

# String 
string = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 

# Look for all words that start with a vowel 
string.scan(/\s[aeiou]\w{1,}/i).each do |word| 

    # Manipulate the words that match the pattern 
    word.upcase 

    # Replace the word in the string with the manipulated value 
    # Need some help here 
end 

# Print the modified string 
puts string 

回答

9

可以使用gsub與塊,所以

string.gsub(/\s[aeiou]\w{1,}/i) do |word| 
    word.upcase 
end 
+2

或'gsub(/ \ s [aeiou] \ w {1,}/i,&:upcase)'如果'upcase'是真正被使用的。 –

2

難道你的意思是這樣的:

string = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 
copy = string 
# Look for all words that start with a vowel 
string.scan(/\s[aeiou]\w{1,}/i).each do |word| 

    # Manipulate the words that match the pattern 
    copy.gsub! word, word.upcase 

end 

# Print the modified string 
puts copy 
+0

+1,注意'\ B'比'\ s' –

+0

更好@CasimiretHippolyte你是對的。也許甚至使用'\ b +' – alfasin

+0

不,只有'\ b'是單詞邊界(一個單詞和一個非單詞字符之間的索引),添加一個量詞沒有任何意義 –

3

String#gsub!可以用塊,這是通過匹配使用串。然後塊的結果被用來替換匹配:

# String 
string = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 

string.gsub!(/\s[aeiou]\w{1,}/i) { |m| m.upcase } 
0

您不必使用gsub

string = "Lorem ipsum dolor sit amet, consectetur adipisicing elit." 

string.split.map {|word| "aeiou".include?(word[0]) ? word.capitalize : word}.join(' ') 
    # => "Lorem Ipsum dolor sit Amet, consectetur Adipisicing Elit." 
+0

謝謝。我意識到可能有更好的方法來完成我在這個例子中給出的東西。這與我正在處理的內容完全無關,我只是提供了一個簡單的例子來解決我正在處理的更復雜的問題。 –

相關問題