我str = "1, 2, a, 3, 4, z"
正則表達式查找和添加
我想用正則表達式查找並添加.3的所有數字的結束和一個冒號:
所有字符開頭。所以期望的輸出將是:
"1.3, 2.3, :a, 3.3, 4.3, :z"
我可以用Ruby中的gsub做到這一點嗎?這是最有效的方法嗎?
我str = "1, 2, a, 3, 4, z"
正則表達式查找和添加
我想用正則表達式查找並添加.3的所有數字的結束和一個冒號:
所有字符開頭。所以期望的輸出將是:
"1.3, 2.3, :a, 3.3, 4.3, :z"
我可以用Ruby中的gsub做到這一點嗎?這是最有效的方法嗎?
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"
如果更換它將被替換爲匹配 文本的字符串。它可能包含對\ 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"
非正則表達式和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(', ')
Downvoter:我怎樣才能提高答案嗎? – falsetru
@falstru:不知道爲什麼你被低估了。你的答案比馬雷克的imo好。 –
我upvoted,但'x =〜/ \ d /'是多餘的。您可以使用命名捕捉來改進答案。 – sawa