我需要在 Ruby 中写一个正则表达式 returns true / false

I need to write a regex in Ruby that returns true / false

我正在尝试编写一个正则表达式,它接受一个单词,并且 return 对于以元音开头的单词为真,对于以辅音开头的单词为 return 为假。我以前从未写过正则表达式,我对如何编写表达式有点困惑。这是我目前所拥有的:

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

编辑:所以如果 word = "boat" ,表达式应该 return false。如果 word = "apple",表达式应该 return 为真。

这里有几种方法可以做到这一点。

#1

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

正则表达式为 "match a vowel, case indifferently (/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

编辑:

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

这应该是有效的:

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

..但是 Eric Duminil 在下面的评论中是如何提到它的,method/function 是 不需要

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

但肯定还有其他(也许更好)的解决方案..

..这是我以前写的不工作的代码:

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

..match 方法 returns nil 当不匹配时,因为 nil 没有定义 length 方法,它引发 NoMethodError

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

但在这种情况下,您根本不需要 if。正则表达式已经 return 匹配了一个可以解释为布尔值的值。 =~ returns 作为整数的匹配索引(即 "truthy"); String#match return 是一个 MatchData 对象(也是真实的)。 Ruby 中的所有内容 除了 falsenil 都是真实的,而 nil=~ 和 [=15] =] return 如果没有匹配项。所以你所要做的就是将其中一个的结果转换为相应的布尔值,你可以用 !! 来完成。例如:

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

那个!!读作"not not",顺便说一句。 ! 运算符本身将其参数视为布尔值,而 return 将其相反视为 actual 布尔值;那是 !( 一些真实值 ) returns false(不是 nil),并且 !(一些虚假值) returns true(不仅仅是一些真实值)。因此应用 ! 两次将任何真值变为 true 并将任何假值(falsenil)变为 false.

在 Ruby 中,您几乎不需要任何东西来 return 判断真假。对于布尔逻辑和 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

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

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

word.match? /\A[aeiou]/i 就是您真正需要的。 (ruby >= 2.4)

它以不区分大小写的方式匹配字符串 \A 后跟元音 [aeiou] 的开头 i 返回布尔值 word.match?

在 ruby 2.4 之前,您必须使用 word.match 并将其转换为布尔值,最简单的方法是使用 !!

逻辑取反两次