我正在尝试编写一个带有单词的正则表达式,对于以元音开头的单词返回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。
答案 0 :(得分:4)
编辑:
好的..所以..我从来没有测试过我以前编写过的代码..它只是作为一些建议如何使用match
和正则表达式,但它根本不起作用..(那段代码片段)现在附在我答案的末尾fyi)
这应该是有效的:
def starts_with_a_vowel?(word)
!!word.capitalize.match(/\A+[AEIOU]/)
end
..但是Eric Duminil在下面的评论中提到了它的方法/功能是如何 不需要
!!word.capitalize.match(/\A+[AEIOU]/)
可以直接使用..
它会返回true
或false
但是肯定还有其他(可能更好)的解决方案..
..这里是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
,将虚假值(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
答案 2 :(得分:1)
你无缘无故地做了很多额外的工作。首先,您不需要检查true
的相等性;只需if *expression*
即可。
但在这种情况下,您根本不需要if
。正则表达式匹配已经返回一个可以解释为布尔值的值。 =~
以整数(“truthy”)返回匹配的索引; String#match
返回MatchData
个对象(也是真实的)。 Ruby中的 Everything 除了false
和nil
之外是真实的,nil
是=~
和String#match
在没有匹配的情况下返回的内容。因此,您所要做的就是将其中一个的结果转换为相应的布尔值,您可以使用!!
。例如:
def starts_with_a_vowel? word
!!(word =~ /^[aeiou]/)
end
顺便说一下,!!
被读为“不是不是”。 !
运算符本身将其参数视为布尔值,并将其反向返回为实际布尔值;那是!(
一些真实价值 )
返回false
(不是nil
),!(
返回一些虚假值< / em> )
返回true
(不仅仅是一些真实的价值)。因此,应用!
两次会将任何真实值转换为true
,将任何虚假值(false
或nil
)转换为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,这是最简单的做法,通过!!