2017-01-16 112 views
0

我想匹配正則表達式的字符串,但它相信它應該返回true時返回false。爲什麼這個正則表達式失敗?

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

#irb example: 
2.2.2 :001 > /^★+$/ =~ '✭' ? true : false 
=> false 
+0

http://rubular.com/r/4qNdvC2Ap3爲我工作。 –

+2

因爲你的模式中的星星是不同的? –

+3

星星是不同的字符(這就是爲什麼他們看起來不同!) –

回答

5

不同星級

你可以接受不同類型的明星:

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

/^[\*✭★☆]+$/ =~ "*✭✭✭★✭★✭☆☆✭★**☆*✭★✭*★★*✭★☆✭☆*★" ? true : false 
#=> true 

對象?真:假

注意,返回truefalse三元運營商可能是沒用的,因爲它轉換truthy到true和falsey到false

你可以只使用:

/^[\*✭★☆]+$/ =~ '✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭' 
#=> 0 

由於0是truthy,它不會改變布爾邏輯東西。

String#match?

隨着Ruby 2.4的,你也可以使用:

'✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭'.match? /^[\*✭★☆]+$/ 
#=> true 

字符串邊界

最後,如果您要檢查整個字符串是全明星,你不應該使用^$\A\z

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

p "✭✭✭✭✭✭✭✭✭\nI'm not a star!!!\n✭✭✭✭✭✭".match? /\A[\*✭★☆]+\z/ 
#=> false 
+2

在Ruby 2.4.0中,您可能想使用['match?'](https://ruby-doc.org/core-2.4.0/String.html#method-i-match-3F):''✭ ✭✭✭✭✭✭✭✭✭✭✭✭✭✭'.match?(/^[\ *✭★] + $ /)' – spickermann

+0

我正在寫它,感謝您的評論。接受了 –

+0

,並感謝冗餘三元運算符 – userFriendly