我仍然与Regex达成协议,并希望制定一个表达式,让我可以计算字符串开头的连续辅音数量。例如。 'Cherry'
将返回2
,'hello'
1
,'schlepp'
4
等。由于这个数字不是预定的(尽管英语可能在初始辅音上有一些上限!)我需要一些灵活的表达方式,但我对如何编写它有点困惑。任何指针都会受到欢迎!
答案 0 :(得分:3)
这样可行:
'Cherry'[/\A[bcdfghjklmnpqrstvwxyz]*/i].length #=> 2
正则表达式在字符串的开头匹配零个或多个辅音。 String#[]
返回匹配的部分,length
确定其长度。
通过[a-z]
交叉[^aeiou]
和&&
,您还可以更简洁地表达辅音字符类:
'Cherry'[/\A[a-z&&[^aeiou]]*/i].length #=> 2
答案 1 :(得分:0)
这条线上的东西可行:
>> 'Cherry'.downcase.split(/([aeiou].*)/).first.length
# => 2
>> 'hello'.downcase.split(/([aeiou].*)/).first.length
# => 1
>> 'schlepp'.downcase.split(/([aeiou].*)/).first.length
# => 4
答案 2 :(得分:0)
另一种方法是从第一个元音替换到字符串结尾,然后取长度:
'Cherry'.gsub(/[aeiou].*$/,"").length
答案 3 :(得分:0)
没有必要使用正则表达式。
CONSONANTS = (('a'..'z').to_a - 'aeiou'.chars).join
#=> "bcdfghjklmnpqrstvwxyz"
def consecutive_constants(str)
e, a = str.each_char.chunk { |c| CONSONANTS.include?(c.downcase) }.first
e ? a.size : 0
end
consecutive_constants("THIS is nuts") #=> 2
consecutive_constants("Is this ever cool?") #=> 0
consecutive_constants("1. this is wrong") #=> 0
请注意
enum = "THIS is nuts".each_char.chunk { |c| CONSONANTS.include?(c.downcase) }
#=> #<Enumerator: #<Enumerator::Generator:0x000000010e1a40>:each>
我们可以通过应用Enumerable#entries(或Enumerable#to_a)来查看此枚举器将生成的元素:
enum.entries
#=> [[true, ["T", "H"]], [false, ["I"]], [true, ["S"]], [false, [" ", "i"]],
# [true, ["s"]], [false, [" "]], [true, ["n"]], [false, ["u"]], [true, ["t", "s"]]]
继续,
e, a = enum.first
#=> [true, ["T", "H"]]
e #=> true
a #=> ["T", "H"]
a.size
#=> 2