2013-11-20 68 views
0

str = "1, 2, a, 3, 4, z"正則表達式查找和添加

我想用正則表達式查找並添加.3的所有數字的結束和一個冒號:所有字符開頭。所以期望的輸出將是:

"1.3, 2.3, :a, 3.3, 4.3, :z" 

我可以用Ruby中的gsub做到這一點嗎?這是最有效的方法嗎?

回答

5

String#gsub接受可選塊。塊的返回值用作替換字符串。使用

str = "1, 2, a, 3, 4, z" 
str.gsub(/\d+|[a-z]+/i) { |x| x =~ /\d/ ? x + '.3' : ':' + x } 
# => "1.3, 2.3, :a, 3.3, 4.3, :z" 

捕獲組:

str.gsub(/(\d+)|([a-z]+)/i) { $1 ? $1 + '.3' : ':' + $2 } 
# => "1.3, 2.3, :a, 3.3, 4.3, :z" 
+2

Downvoter:我怎樣才能提高答案嗎? – falsetru

+1

@falstru:不知道爲什麼你被低估了。你的答案比馬雷克的imo好。 –

+1

我upvoted,但'x =〜/ \ d /'是多餘的。您可以使用命名捕捉來改進答案。 – sawa

3

String#gsub documentation

如果更換它將被替換爲匹配 文本的字符串。它可能包含對\ d格式的捕獲組 的反引用,其中d是組編號或\ k,其中n是一個 組名。如果它是一個雙引號字符串,則兩個反引用必須在前面加上反斜槓 。但是,在替換 內,特殊匹配變量(例如$ &)將不會引用當前的 匹配項。

解決辦法:

str = "1, 2, a, 3, 4, z" 
str.gsub(/(\d)+/, '\1.3').gsub(/([a-z])+/i, ':\1') 
# => "1.3, 2.3, :a, 3.3, 4.3, :z" 
1

非正則表達式和GSUB版本:

str = "1, 2, a, 3, 4, z" 

result = str.split(', ').map do |chr| 
    case chr.downcase 
    when 'a'..'z' then ":#{chr}" 
    when '1'..'9' then "#{chr}.3" 
    end 
end.join(', ')