如何计算Ruby中字符串开头的连续辅音?

时间:2017-08-02 09:06:20

标签: ruby regex regex-lookarounds

我仍然与Regex达成协议,并希望制定一个表达式,让我可以计算字符串开头的连续辅音数量。例如。 'Cherry'将返回2'hello' 1'schlepp' 4等。由于这个数字不是预定的(尽管英语可能在初始辅音上有一些上限!)我需要一些灵活的表达方式,但我对如何编写它有点困惑。任何指针都会受到欢迎!

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