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