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

我需要用Ruby编写一个返回true/false的正则表达式,ruby,regex,startswith,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。如果wor

我试图写一个正则表达式,它接受一个单词,以元音开头的单词返回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

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

#1

word = 'Ahoy'
!!(word[0] =~ /[aeiou]/i)
  #=> true
word = 'hiya'
!!(word[0] =~ /[aeiou]/i)
  #=> false
正则表达式是这样写的:“匹配一个元音,不区分大小写(
/i
)”<代码>将thruthy值转换为
true
,将falsy值(
nil
false
)转换为
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
编辑:

好的。。所以我从未测试过我以前编写的代码。。它的意思只是建议如何将
匹配
与regex一起使用,但它根本不起作用。。(该代码段现在附在我的答案末尾,仅供参考)

这应该是有效的:

def starts_with_a_vowel?(word)
  !!word.capitalize.match(/\A+[AEIOU]/)
end
…但是Eric Duminil在下面的评论中提到的方法/功能是 不需要

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

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

…这是我以前写的不起作用的代码:

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

…当不匹配时,
match
方法返回
nil
,因为
nil
没有定义
length
方法,它会导致
NoMethodError
您无缘无故地做了大量额外的工作。首先,您不需要检查是否与
true
相等;只要
if*expression*
就行了

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

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

读作“非非”。
运算符本身将其参数视为布尔值,并将其对立面作为实际布尔值返回;那是
!(
some truthy value
返回
false
(而不是
nil
)和
!(
某些假值
返回
真值
(而不仅仅是一些真值)。所以应用
两次将任何真值转换为
true
,将任何假值(
false
nil
)转换为
false
,在Ruby中,几乎不需要任何东西来返回真值或假值。对于布尔逻辑和
if/case/inspect
语句,
truthy/false
就足够了。另外,不要忘记使用不区分大小写的正则表达式(与
//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已经提供了什么


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

它以不区分大小写的方式匹配字符串
\A
的开头,后跟元音
[aeiou]
,返回bool
单词。匹配?


在ruby 2.4之前,您必须使用
word.match
并将其转换为bool,最简单的方法是使用
对其进行两次逻辑求反

你第一句话的最后一个单词应该是“辅音”吗?如果您提供一个示例字符串并显示该字符串的结果(例如,字符串、数组、其他?),则会有所帮助。在给出示例时,如果为每个输入分配一个变量(例如,
str=“How now,brown cow?”
)会很有帮助。这样,读者就可以在注释和答案中引用这些变量,而无需定义它们
str.capitalize.以?('A'、'E'、'I'、'O'、'U')开头
您可能有理由想返回
true
false
,但当需要逻辑值时,更常见的是返回“truthy”值(除
nil
false
之外的任何值)或“falsy”值(
nil
false
)。例如:
'cat'=~/a/?“喵喵”:“呜呜”给出与
相同的结果!!('cat'=~/a/)?“喵喵”:“呜呜”
更简单更干净。好吧,对不起,我的意思是它需要一个词。只是一个单词,不像一个句子。所以结果应该是布尔值。很抱歉造成混淆。您为什么在这里使用
^
?既然我们处理的是字符串,那不是
\A
的方法吗?你说得对<代码>“平面\平面”。以一个元音开头?#=>6
。ThanksI认为当不使用
//m
修饰符时,它们是等价的。但多行修饰语似乎只影响
,而不是
^
$
“A”
也是元音。是的。不过,如果你看一下原始帖子,你会注意到正则表达式只指定了小写元音。如果OP需要匹配两个大小写,他们可以在调用
start\u with?
之前将大写元音添加到
元音
数组或
downcase
字符串中。更好的是,我将恢复我的下一票。顺便说一下,您不需要
返回
,而且
/\A/
也不需要
+
为了让问题更清楚,您可以将第一个代码放在答案的末尾,解释为什么它不起作用。
vowels = %w(a e i o u)
"boat".start_with?(*vowels)
# => false
"apple".start_with?(*vowels)
#=> true