单词前三个字符的正则表达式

时间:2012-11-28 22:42:11

标签: ruby regex

我试图确定一个单词是否以元音,一个辅音,两个辅音或三个辅音开头。这是我到目前为止,但我不能让它工作。

  def vowel_first(word)
    word[0] =~ /[aeiou]/
  end

  def consonant_first_three(word)
    word[0-2] =~ /^[^aeiou]{3}/
  end

  def consonant_first_two(word)
    word[0-1] =~ /[^aeiou]{2}/
  end

  def consonant_first(word)
    word[0] =~ /[^aeiou]{1}/
  end

4 个答案:

答案 0 :(得分:3)

word[0-2]中的破折号失败了。尝试用..运算符替换它们(产生一个范围)。

答案 1 :(得分:0)

此处的问题似乎是您在比较之前对word进行了修改。在这种情况下,0-1评估为-1,这意味着“最后一个字符”。同样,word[0]引用第一个字符,索引为零,"foo"评估为"f"

您应该按原样使用word。正则表达式被正确锚定,如果你给它一些匹配的东西,它应该可以工作。

作为一个注释,使用word.match(/.../)通常比word =~ /.../更具可读性,因为该操作符是Perl的延续,Perl是一种从未因其可读性而备受赞誉的语言。

答案 2 :(得分:0)

导致问题的是这个词吗?尝试使用以下两个选项之一:

def vowel_first(word)
  word[0] =~ /[aeiouAEIOU]/
end

def vowel_first(word)
  word[0] =~ /[aeiou]/i
end

或者更好的是你真的不需要提取字母只是让正则表达式完成所有的工作:

def vowel_first(word)
  word =~ /^[aeiou]/i
end

答案 3 :(得分:0)

您可以在单词的开头简单地检查并发辅音的数量:

leading_consonants = word.match(/^[^aeiou]{,3}/)[0].length

当它为零时,单词以非辅音开头。根据您的要求,这可能足够好;如果你必须考虑标点符号等等,你可能需要更聪明一点:

matches = word.match(/^([aeiou]?)([^aeiou]{,3})/)
leading_vowel = matches && matches[1].length > 0 || false
leading_consonants = matches && matches[2].length || 0