正则表达式以查找字符串中的第一个字母

时间:2014-02-03 21:39:53

标签: ruby regex

考虑这个示例字符串:

mystr ="1.         moody"

我想将mystr中出现的第一个字母大写。我在Ruby中尝试这个正则表达式,但仍然返回mystr(喜怒无常)中的所有字母而不是字母m。

puts mystr.scan(/[a-zA-Z]{1}/)

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:4)

使用String#sub

执行以下操作
(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}/, &:upcasediego.greyrobot’s answer)根本不匹配,因此该行不会更改。

这里有两个问题。第一个是[a-zA-Z]与重音字符不匹配,因此é不匹配。解决此问题的方法是使用\p{Letter} character property

mystr.sub /\p{Letter}/, &:upcase

这将匹配相关字符,但不会更改它。这是由于第二个问题,即upcase(和downcaseonly 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"

希望有所帮助。