2017-01-16 9 views
0

Ich versuche eine Zeichenfolge zu regexp zu finden, aber es gibt false zurück, wenn ich glaube, dass es True zurückgeben sollte.Warum schlägt dieser reguläre Ausdruck fehl?

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

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

http://rubular.com/r/4qNdvC2Ap3 arbeitet für mich. –

+2

Weil der Stern in Ihrem Muster anders ist? –

+3

Die Sterne sind verschiedene Charaktere (deshalb sehen sie anders aus!) –

Antwort

5

Verschiedene Sterne

könnten Sie andere Art von Sternen akzeptieren:

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

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

Objekt? true

Beachten Sie, dass ein ternärer Operator, der true oder false zurückgibt, ist wahrscheinlich nutzlos, weil es zu true und Falsey zu false truthy umwandelt.

Sie könnten nur verwenden:

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

Seit 0 truthy ist, wäre es nichts für Boolesche Logik ändern.

Zeichenfolge # übereinstimmen?

Wie von Ruby 2.4, könnten Sie auch:

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

String Grenzen

Schließlich, wenn Sie, dass die ganze Reihe der Sterne voll überprüfen möchten, können Sie nicht ^ verwenden sollten, oder $ aber \A und \z:

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

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

In Ruby 2.4.0 können Sie ['match?'] (Https://ruby-doc.org/core-2.4.0/String.html#method-i-match-3F) verwenden: ''✭ ✭✭✭✭✭✭✭✭✭✭✭✭✭✭'match? (/^[\ * ✭ ★] + $ /) ' – spickermann

+0

Ich schreibe darauf, danke für den Kommentar. –

+0

akzeptiert, und danke für die Köpfe auf dem redundanten ternären Operator – userFriendly

Verwandte Themen