正则表达式以查找字符串中的第一个字母
考虑这个示例字符串:
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,这可能不会影响您,但在其他情况下值得了解。