我需要在Ruby中编写一个返回true / false的正则表达式

时间:2016-12-17 01:41:40

标签: ruby regex startswith

我正在尝试编写一个带有单词的正则表达式,对于以元音开头的单词返回true,对于以辅音开头的单词返回false。我之前从未写过正则表达式,我对如何编写表达式感到有些困惑。这就是我到目前为止所做的:

def starts_with_a_vowel?(word)
  if word.match(/\A+[aeiou]/) == true
    return true
  else
    return false  
  end
end

编辑:所以如果word =“boat”,表达式应该返回false。如果word =“apple”,则表达式应返回true。

6 个答案:

答案 0 :(得分:4)

编辑:

好的..所以..我从来没有测试过我以前编写过的代码..它只是作为一些建议如何使用match和正则表达式,但它根本不起作用..(那段代码片段)现在附在我答案的末尾fyi)

这应该是有效的:

def starts_with_a_vowel?(word)
  !!word.capitalize.match(/\A+[AEIOU]/)
end

..但是Eric Duminil在下面的评论中提到了它的方法/功能是如何  不需要

!!word.capitalize.match(/\A+[AEIOU]/)可以直接使用.. 它会返回truefalse

但是肯定还有其他(可能更好)的解决方案..

..这里是NOT工作代码,我以前写过:

def starts_with_a_vowel?(word)
  return word.match(/\A+[aeiou]/).length > 0
end

.. match方法在不匹配时返回nil,并且由于nil没有定义length方法,因此会引发NoMethodError

答案 1 :(得分:2)

以下是一些方法。

<强>#1

word = 'Ahoy'
!!(word[0] =~ /[aeiou]/i)
  #=> true
word = 'hiya'
!!(word[0] =~ /[aeiou]/i)
  #=> false

正则表达式上写着“与元音匹配,案件无关紧要(/i)”。 !!将值得信息的值转换为true,将虚假值(nilfalse)转换为false

!!0 = !(!0) = !(false) = true
!!nil = !(!nil) = !(true) = false

<强>#2

word = 'Ahoy'
(word[0] =~ /[aeiou]/i) ? true : false
  #=> true
word = 'hiya'
(word[0] =~ /[aeiou]/i) ? true : false
  #=> false

答案 2 :(得分:1)

你无缘无故地做了很多额外的工作。首先,您不需要检查true的相等性;只需if *expression*即可。

但在这种情况下,您根本不需要if。正则表达式匹配已经返回一个可以解释为布尔值的值。 =~以整数(“truthy”)返回匹配的索引; String#match返回MatchData个对象(也是真实的)。 Ruby中的 Everything 除了falsenil之外是真实的,nil=~String#match在没有匹配的情况下返回的内容。因此,您所要做的就是将其中一个的结果转换为相应的布尔值,您可以使用!!。例如:

def starts_with_a_vowel? word
  !!(word =~ /^[aeiou]/)
end

顺便说一下,!!被读为“不是不是”。 !运算符本身将其参数视为布尔值,并将其反向返回为实际布尔值;那是!( 一些真实价值 )返回false(不是nil),!( 返回一些虚假值< / em> )返回true(不仅仅是一些真实的价值)。因此,应用!两次会将任何真实值转换为true,将任何虚假值(falsenil)转换为false

答案 3 :(得分:1)

在Ruby中,你几乎不需要任何返回true或false的东西。对于布尔逻辑和if/case/unless语句,truthy/falsey足够好。此外,不要忘记使用不区分大小写的正则表达式(//i)。 A是一个元音:

class String
  def starts_with_a_vowel?
    self =~ /\A[aeiou]/i
  end
end

if "Airplane".starts_with_a_vowel?
  puts "Indeed"
end
#=> "Indeed"

如果由于某种原因你确实需要true/false

class String
  def starts_with_a_vowel?
    !(self =~ /\A[aeiou]/i).nil?
  end
end

答案 4 :(得分:1)

使用正则表达式吗?只是问因为Ruby已经提供了String#start_with?

vowels = %w(a e i o u)
"boat".start_with?(*vowels)
# => false
"apple".start_with?(*vowels)
#=> true

答案 5 :(得分:1)

word.match? /\A[aeiou]/i实际上就是你所需要的。 (ruby&gt; = 2.4)

它匹配字符串\A的开头,后跟元素[aeiou],不区分大小写i返回bool word.match?

在ruby 2.4之前你必须使用word.match并将其转换为bool,这是最简单的做法,通过!!

逻辑否定它两次