【发布时间】:2018-01-09 09:54:05
【问题描述】:
我仍在接受正则表达式,并想制定一个表达式,让我计算字符串开头连续辅音的数量。例如。 'Cherry' 将返回 2、'hello' 1、'schlepp' 4 等等。由于数字不是预先确定的(尽管英语可能对初始辅音有一些上限!)我需要一些灵活的表达方式,但我对如何编写它有点卡住。欢迎任何指点!
【问题讨论】:
标签: ruby regex regex-lookarounds
我仍在接受正则表达式,并想制定一个表达式,让我计算字符串开头连续辅音的数量。例如。 'Cherry' 将返回 2、'hello' 1、'schlepp' 4 等等。由于数字不是预先确定的(尽管英语可能对初始辅音有一些上限!)我需要一些灵活的表达方式,但我对如何编写它有点卡住。欢迎任何指点!
【问题讨论】:
标签: ruby regex regex-lookarounds
沿着这条线的东西会起作用:
>> 'Cherry'.downcase.split(/([aeiou].*)/).first.length
# => 2
>> 'hello'.downcase.split(/([aeiou].*)/).first.length
# => 1
>> 'schlepp'.downcase.split(/([aeiou].*)/).first.length
# => 4
【讨论】:
split 将返回一个包含 2 个字符串的数组。我们只需要第一个字符串的length。如果答案对您有帮助,请接受并投票。谢谢:)
另一种方法是从第一个元音到字符串末尾什么都不替换,然后取长度:
'Cherry'.gsub(/[aeiou].*$/,"").length
【讨论】:
不需要使用正则表达式。
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
【讨论】: