2013-11-20 67 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(', ')