Ruby-将包含名称的字符串缩写为名字的首字母

Ruby-将包含名称的字符串缩写为名字的首字母,ruby,Ruby,相当简单的问题,我需要一个字符串,例如,包含“Bob Smith”并返回“Bob S.”或“Javier de Luca”并返回“Javier de L.”。换句话说,将字符串中的最后一个单词缩写为首字母,并添加句点 这就是我所拥有的——它可以工作,但看起来很笨拙 str = str.split(' ') str[str.length - 1] = "#{str.last[0]}." str = str.join(' ') 当然,还有一种更优雅的方式。您可以在1.9中使用点击: str = s

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

这就是我所拥有的——它可以工作,但看起来很笨拙

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

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

您可以在1.9中使用
点击

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

使用
a[-1].sub
将修改最后一个元素,因此
点击
块将修改
a
,并将其传递给
join
调用。而且,
+
负责单独留下像
joeb
这样的奇怪名字;如果您想让它成为
Joe B.
他们使用
*
而不是
+

,您可以使用1.9中的
点击

str = str.split(/\s+/).tap { |a| a[-1].sub!(/(.).+/) { "#{$1}." } }.join(' ')
>> "Bob Smith".sub(/(.+\b.).+\z/, '\1.')
=> "Bob S."
>> "Javier de Luca".sub(/(.+\b.).+\z/, '\1.')
=> "Javier de L."
使用
a[-1].sub
将修改最后一个元素,因此
点击
块将修改
a
,并将其传递给
join
调用。而且,
+
负责单独留下像
joeb
这样的奇怪名字;如果你想让它变成
joeb.
他们使用
*
而不是
+

>> "Bob Smith".sub(/(.+\b.).+\z/, '\1.')
=> "Bob S."
>> "Javier de Luca".sub(/(.+\b.).+\z/, '\1.')
=> "Javier de L."
此正则表达式捕获整个字符串,直到最后一个单词的第二个字符。然后它用捕获加上一个句点来替换这个字符串。
\1.

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

这个呢:

name = 'Javier de Luca'
name.sub!(/(\w)\w+$/, '\1.')
那么这个呢:

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

美丽的。我想我甚至可以理解正则表达式美丽的。我想我甚至可以理解正则表达式