2017-08-02 85 views
0

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

回答

3

这会工作:

'Cherry'[/\A[bcdfghjklmnpqrstvwxyz]*/i].length #=> 2 

正则表达式在字符串的开头零个或多个辅音匹配。 String#[]返回匹配部分,length确定其长度。

您也可以表达辅音字符类通过&&通过交叉[a-z][^aeiou]更简洁:

'Cherry'[/\A[a-z&&[^aeiou]]*/i].length #=> 2 
+1

'“1. Cherry cobler。”[r] .length#=> 0',因为它应该。 –

0

东西沿着这条线将工作:

>> 'Cherry'.downcase.split(/([aeiou].*)/).first.length 
# => 2 
>> 'hello'.downcase.split(/([aeiou].*)/).first.length 
# => 1 
>> 'schlepp'.downcase.split(/([aeiou].*)/).first.length 
# => 4 
+0

很酷,比KS。为什么在.length之前,这里使用第一种方法? – user211309

+0

'split'将返回2个字符串的数组。我们只需要第一个字符串的“长度”。如果答案对您有帮助,请接受并点赞。谢谢:) – Sajin

+0

如果字符串以字母之外的其他字母开头会怎样? –

0

另一种方式是从第一个元音替换,直到没有任何字符串的结尾然后采取长度:

'Cherry'.gsub(/[aeiou].*$/,"").length 
+0

如果字符串不是以字母开头怎么办?例如,“1.做晚餐预订”。 –

+0

@CarySwoveland:当然,它不会工作(作为其他答案),但这些案件尚未被OP明确要求。 – Toto

+0

OP只说对象是一个字符串,那么为什么不写这个方法,使它可以工作,而不管它是否以字母开头? –

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 
相关问题