考虑这个示例字符串:
mystr ="1. moody"
我想将mystr
中出现的第一个字母大写。我在Ruby中尝试这个正则表达式,但仍然返回mystr
(喜怒无常)中的所有字母而不是字母m。
puts mystr.scan(/[a-zA-Z]{1}/)
任何帮助表示赞赏!
答案 0 :(得分:4)
(arup~>~)$ pry --simple-prompt
>> s = "1. moody"
=> "1. moody"
>> s.sub(/[a-z]/i,&:upcase)
=> "1. Moody"
>>
如果要修改源字符串,请使用s.sub!(/[a-z]/,&:upcase)
。
答案 1 :(得分:3)
为了完整起见,虽然它没有直接回答您提出的问题,但可能具有相关性,请考虑以下变化:
mystr ="1. école"
mystr.sub(/[a-z]/i,&:upcase)
行(如Arup Rakshit’s answer中所述)将匹配单词的第二个字母,生成
1. éCole
行mystr.sub /\b\s?[a-zA-Z]{1}/, &:upcase
(diego.greyrobot’s answer)根本不匹配,因此该行不会更改。
这里有两个问题。第一个是[a-zA-Z]
与重音字符不匹配,因此é
不匹配。解决此问题的方法是使用\p{Letter}
character property:
mystr.sub /\p{Letter}/, &:upcase
这将匹配相关字符,但不会更改它。这是由于第二个问题,即upcase
(和downcase
)only works on characters in the ASCII range。这几乎同样容易修复,但依赖于使用外部库,例如unicode_utils
:
require 'unicode_utils'
mystr.sub(/\p{Letter}/) { |c| UnicodeUtils.upcase(c)}
这导致:
1. École
这可能就是这种情况下的需要。
如果您确定所有数据都只是ASCII,这可能不会影响您,但在其他情况下值得了解。
答案 2 :(得分:0)
您尝试返回所有字母的原因是因为您使用的是scan
方法,它会返回所有与正则表达式匹配的字符,在您的大小写字母中。对于您的用例,您应该使用sub
,因为您只想sub
写一封信。
我使用http://rubular.com练习我的Ruby Regex。这就是我提出的http://rubular.com/r/fAQEDFVEVn
正则表达式是:/\b[a-z]/
它使用\b
来查找单词边界,最后我们只询问一个字母[a-zA-Z]
最后,我们将使用sub
将其替换为更新的版本:
"1. moody".sub /\b[a-z]/, &:upcase
=> "1. Moody"
希望有所帮助。