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

考虑这个示例字符串:

mystr ="1. moody" 

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

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

任何帮助赞赏!

您尝试返回所有字母的原因是因为您正在使用scan方法,它会返回所有与正则表达式匹配的字符,在您的大小写字母中。 对于您的用例,您应该使用sub因为您只想要替换1个字母。

我使用http://rubular.com练习我的Ruby Regexes。 这是我想出的http://rubular.com/r/fAQEDFVEVn

正则表达式是: /\b[az]/

它使用\b来查找单词边界,最后我们只用[a-zA-Z]要一个字母

最后我们将使用sub来替换它的upxased版本:

 "1. moody".sub /\b[az]/, &:upcase => "1. Moody" 

希望有所帮助。

使用String#sub执行以下操作

 (arup~>~)$ pry --simple-prompt >> s = "1. moody" => "1. moody" >> s.sub(/[az]/i,&:upcase) => "1. Moody" >> 

如果要修改源字符串,请使用s.sub!(/[az]/,&:upcase)

只是为了完整性,虽然它没有直接回答您提出的问题,但可能是相关的,请考虑以下变化:

 mystr ="1. école" 

mystr.sub(/[az]/i,&:upcase) (如在Arup Rakshit的回答中 )将匹配单词的第二个字母,生成

 1. éCole 

mystr.sub /\b\s?[a-zA-Z]{1}/, &:upcase /,&:upcase(diego.greyrobot的答案 )根本不匹配,因此该行将保持不变。

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

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

这将匹配相关字符,但不会更改它。 这是由于第二个问题,即upcase (和downcase ) 仅适用于ASCII范围内的字符 。 这几乎很容易修复,但依赖于使用外部库,如unicode_utils

 require 'unicode_utils' mystr.sub(/\p{Letter}/) { |c| UnicodeUtils.upcase(c)} 

这导致:

 1. École 

在这种情况下,这可能是想要的。

如果您确定所有数据都只是ASCII,这可能不会影响您,但在其他情况下值得了解。