我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