Ruby - 缩写包含名字的字符串,以名字命名最后一个首字母

时间:2011-09-28 23:35:12

标签: ruby

相当简单的问题我需要拿一个字符串,例如“Bob Smith”并返回“Bob S.” - 或“Javier de Luca”并返回“Javier de L.”。换句话说,将字符串中的最后一个单词缩写为第一个单词并添加句点。

这就是我所拥有的 - 它有效,但看起来很笨拙。

str = str.split(' ')
str[str.length - 1] = "#{str.last[0]}."
str = str.join(' ')

当然,有一种更优雅的方式。

3 个答案:

答案 0 :(得分:4)

>> "Bob Smith".sub(/(.+\b.).+\z/, '\1.')
=> "Bob S."
>> "Javier de Luca".sub(/(.+\b.).+\z/, '\1.')
=> "Javier de L."

此正则表达式捕获整个字符串,直到最后一个单词的第二个字符。然后它用捕获加上句点ala \1.

替换此字符串

答案 1 :(得分:1)

这个怎么样:

name = 'Javier de Luca'
name.sub!(/(\w)\w+$/, '\1.')

答案 2 :(得分:0)

您可以在1.9中使用tap

str = str.split(/\s+/).tap { |a| a[-1].sub!(/(.).+/) { "#{$1}." } }.join(' ')

使用a[-1].sub!将修改最后一个元素,以便tap块修改a并将其传递给join调用。并且,.+负责留下像Joe B这样的奇怪名字;如果您希望它成为Joe B.,则使用.*代替.+