如何在Ruby中大写字符串中的第一个字母
如何在Ruby中大写字符串中的第一个字母,ruby,Ruby,upcase方法将整个字符串大写,但我只需要将第一个字母大写 此外,我还需要支持几种流行语言,如德语和俄语 怎么做?使用大写。从文件中: 返回str的副本,第一个字符转换为大写,其余字符转换为小写 这取决于您使用的Ruby版本: Ruby 2.4及更高版本: 它只起作用,因为它支持Unicode大小写映射: "мария".capitalize #=> Мария Ruby 2.3及更低版本: "maria".capitalize #=> "Maria" "мария".capit
upcase
方法将整个字符串大写,但我只需要将第一个字母大写
此外,我还需要支持几种流行语言,如德语和俄语
怎么做?使用
大写。从文件中:
返回str的副本,第一个字符转换为大写,其余字符转换为小写
这取决于您使用的Ruby版本:
Ruby 2.4及更高版本:
它只起作用,因为它支持Unicode大小写映射:
"мария".capitalize #=> Мария
Ruby 2.3及更低版本:
"maria".capitalize #=> "Maria"
"мария".capitalize #=> мария
问题是,它只是不做您希望它做的事情,它输出的是Мааааа
,而不是Мааа
如果您使用Rails,有一个简单的解决方法:
"мария".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte
否则,您必须安装gem并按如下方式使用:
require 'unicode'
Unicode::capitalize("мария") #=> Мария
Ruby 1.8:
请务必使用“编码魔术”注释:
#!/usr/bin/env ruby
puts "мария".capitalize
给出了无效的多字节字符(US-ASCII)
,而:
#!/usr/bin/env ruby
#coding: utf-8
puts "мария".capitalize
可以正常工作,但也可以参阅“Ruby 2.3及更低版本”部分了解实际大写字母。不幸的是,机器不可能正确地升/降/大写字母。它需要太多的上下文信息,计算机无法理解
这就是为什么Ruby的String
类只支持ASCII字符的大小写,因为它至少在某种程度上定义得很好
我所说的“上下文信息”是什么意思
例如,要正确地大写i
,您需要知道文本使用的是哪种语言。例如,英语只有两个i
s:大写i
没有点,小写i
有点。但是土耳其语有四个i
s:大写i
无点,大写İ
带点,小写ı
无点,小写i
带点。因此,在英语中是“i”。在土耳其语中是“i”。在土耳其语中是“i”。在土耳其语中是“i”。换句话说:由于'i'.upcase
可以返回两种不同的结果,这取决于语言,因此在不了解其语言的情况下,显然不可能正确地将单词大写
但是Ruby不懂语言,它只知道编码。因此,不可能使用Ruby的内置功能正确地将字符串大写
更糟糕的是:即使知道语言,有时也不可能正确地使用大写字母。例如,在德语中,'Maße'.upcase#=>'MASSE'
(Maße是Maß的复数意思)。但是,'Masse'。upcase#=>'Masse'
(表示质量)。那么,什么是“集体”。大写?换句话说:正确的资本化需要全面的人工智能
因此,Ruby没有有时给出错误的答案,而是选择有时根本不给出答案,这就是为什么非ASCII字符在downcase/upcase/capitalize操作中被忽略的原因。(当然也会读错结果,但至少很容易检查。)将字符串第一个单词的第一个字母大写
"kirk douglas".capitalize
#=> "Kirk douglas"
将每个单词的第一个字母大写
在rails中:
或
在ruby中:
或
好吧,这样我们就知道如何只大写第一个字母,而不使用其余的字母,因为有时这正是我们想要的:
['NASA', 'MHz', 'sputnik'].collect do |word|
letters = word.split('')
letters.first.upcase!
letters.join
end
=> ["NASA", "MHz", "Sputnik"]
调用大写
将导致[“Nasa”、“Mhz”、“Sputnik”]
您可以使用mb字符
。这是对乌姆劳特的尊重:
class String
# Only capitalize first letter of a string
def capitalize_first
self[0] = self[0].mb_chars.upcase
self
end
end
示例:
"ümlaute".capitalize_first
#=> "Ümlaute"
轨道5+
对于Active Support和Rails 5.0.0.beta4,您可以使用两种方法之一:String#upcase_first
或ActiveSupport::Inflector#upcase_first
"my API is great".upcase_first #=> "My API is great"
"мария".upcase_first #=> "Мария"
"мария".upcase_first #=> "Мария"
"NASA".upcase_first #=> "NASA"
"MHz".upcase_first #=> "MHz"
"sputnik".upcase_first #=> "Sputnik"
查看“”以了解更多信息。下面是将字符串中的每个单词大写的另一种方法\w
不匹配西里尔字母或带变音符号的拉丁字母,但[[:word:]
匹配upcase
、downcase
、capitalize
和swapcase
直到Ruby 2.4.0于2016年发布后才适用于非ASCII字符
“aAa BBBäааааaаa”。gsub(/\w+/,&:大写)
=>“Aaa Bbbäаааааaаaаaаaаaаaаa”
“aAa BBBаааааааааaаaаaаa”。gsub(/[:word:]+/,&:大写)
=>“Aaa BbbÄМаааaаaаaаa”
[[:word:]
匹配以下类别中的字符:
Ll(字母,小写)
Lu(字母,大写)
Lt(字母、标题)
劳(信、其他)
Lm(字母,修饰语)
Nd(数字,十进制数字)
Pc(标点符号、连接器)
[[:word:]
匹配“标点符号,连接器”(Pc
)类别中的所有10个字符:
005F uuu低端
203F——领带下摆
2040年——人物领带
2054⁔倒底系带
FE33︳垂直低线表示表
FE34︴垂直波浪低线表示形式
FE4D﹍低虚线
FE4E﹎中线低线
FE4F﹏波浪低线
FF3F_全宽低端线路
这是仅将字符串的第一个字符转换为大写的另一种方法:
“striNG”.sub(/./,&:upcase)
=>“字符串”
我的版本:
class String
def upcase_first
return self if empty?
dup.tap {|s| s[0] = s[0].upcase }
end
def upcase_first!
replace upcase_first
end
end
['NASA title', 'MHz', 'sputnik'].map &:upcase_first #=> ["NASA title", "MHz", "Sputnik"]
同时检查:
如果要更改原始字符串,请仅使用感叹号。谢谢,修复了我的错误。-1。OP明确提到德语和俄语文本,这意味着非ASCII字符String#upcase
(以及String#downcase
)仅为ASCII字符定义。今天使用Ruby 2.5.0和String#upcase
似乎可以很好地处理非ASCII字符<代码>2.5.0:001>“МааЯ”。upcase=>“МАПЯ”
@Huliax,如公认答案中所述,这只是Ruby 2.4.0(于2016年发布)以来的情况。请注意,一些语言对大写的第一个字母有不同的想法。在爱尔兰语中,你会说“i mBaileÁtha Cliath”(“在都柏林”)——小写字母“m”
['NASA', 'MHz', 'sputnik'].collect do |word|
letters = word.split('')
letters.first.upcase!
letters.join
end
=> ["NASA", "MHz", "Sputnik"]
class String
# Only capitalize first letter of a string
def capitalize_first
self[0] = self[0].mb_chars.upcase
self
end
end
"ümlaute".capitalize_first
#=> "Ümlaute"
"my API is great".upcase_first #=> "My API is great"
"мария".upcase_first #=> "Мария"
"мария".upcase_first #=> "Мария"
"NASA".upcase_first #=> "NASA"
"MHz".upcase_first #=> "MHz"
"sputnik".upcase_first #=> "Sputnik"
class String
def upcase_first
return self if empty?
dup.tap {|s| s[0] = s[0].upcase }
end
def upcase_first!
replace upcase_first
end
end
['NASA title', 'MHz', 'sputnik'].map &:upcase_first #=> ["NASA title", "MHz", "Sputnik"]