【问题标题】:How to count consecutive consonants at beginning of a string in Ruby?如何计算Ruby中字符串开头的连续辅音?
【发布时间】:2018-01-09 09:54:05
【问题描述】:

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

【问题讨论】:

    标签: ruby regex regex-lookarounds


    【解决方案1】:

    这可行:

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

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

    你还可以通过&&相交[a-z][^aeiou]来更简洁地表达辅音字符类:

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

    【讨论】:

    • "1. Cherry cobler."[r].length #=> 0,应该如此。
    【解决方案2】:

    沿着这条线的东西会起作用:

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

    【讨论】:

    • 太棒了,谢谢。为什么在这里使用第一种方法,在.length之前?
    • split 将返回一个包含 2 个字符串的数组。我们只需要第一个字符串的length。如果答案对您有帮助,请接受并投票。谢谢:)
    • 如果字符串以非字母开头怎么办?
    • user211309,如果有帮助的答案将被接受并且是所有提交的答案中最有帮助的。此外,选择答案并不急于求成。这里的许多人至少要等几个小时。 Sajin,imo,要求选择一个人的答案是不专业的,尤其是当提问者是 SO 新手并且可能不熟悉应用复选标记的标准时。对于一个人来说,我永远不会将绿党奖励给提出要求的人。
    • @CarySwoveland 我完全同意“如果答案有帮助并且是提交的所有答案中最有帮助的,则将被接受”。当他说谢谢时,我以为这就是他正在寻找的答案。所以我认为如果答案是正确的,最好接受一个答案,而不是让它不被接受,这样会鼓励像我们这样的人回答更多的问题。我也接受 Stefan 的回答要好得多的事实。为此 +1。
    【解决方案3】:

    另一种方法是从第一个元音到字符串末尾什么都不替换,然后取长度:

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

    【讨论】:

    • 如果字符串不以字母开头怎么办?例如,`“1. 预订晚餐”。
    • @CarySwoveland:当然,它不会起作用(与其他答案一样),但 OP 并未明确要求这些案例。
    • OP只说对象是一个字符串,那为什么不写方法让它不管是否以字母开头都能正常工作呢?
    【解决方案4】:

    不需要使用正则表达式。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2018-04-30
      • 2012-05-13
      • 2021-05-19
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多