为什么这个正则表达式失败了?

use*_*dly 0 ruby regex

我正在尝试将字符串与regexp匹配,但是当我认为它应该返回true时它返回false.

/^?+$/ =~ '???????????????' ? true : false

#irb example:
2.2.2 :001 > /^?+$/ =~ '?' ? true : false
=> false 
Run Code Online (Sandbox Code Playgroud)

Eri*_*nil 5

不同的星星

你可以接受不同类型的星星:

/^[\*???]+$/ =~ '???????????????' ? true : false
#=> true

/^[\*???]+$/ =~ "*???????????**?*???*??*?????*?" ? true : false
#=> true
Run Code Online (Sandbox Code Playgroud)

对象?真假

请注意,三元运算符返回truefalse可能无用,因为它将truthy转换为truefalsey false.

你可以使用:

/^[\*???]+$/ =~ '???????????????'
#=> 0
Run Code Online (Sandbox Code Playgroud)

由于0是真的,它不会改变布尔逻辑的任何东西.

串#匹配?

从Ruby 2.4开始,您还可以使用:

'???????????????'.match? /^[\*???]+$/
#=> true
Run Code Online (Sandbox Code Playgroud)

字符串边界

最后,如果您要检查整个字符串是全明星,你不应该使用^$,但\A\z:

p "?????????\nI'm not a star!!!\n??????".match? /^[\*???]+$/
#=> true

p "?????????\nI'm not a star!!!\n??????".match? /\A[\*???]+\z/
#=> false
Run Code Online (Sandbox Code Playgroud)

  • 在Ruby 2.4.0中你可能想使用[`match?`](https://ruby-doc.org/core-2.4.0/String.html#method-i-match-3F):''✭✭ ✭✭✭✭✭✭✭✭✭✭✭✭✭'.match?(/ ^ [\*✭★] + $ /)` (2认同)