Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中大写字符串中的第一个字母_Ruby - Fatal编程技术网

如何在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"]