2016-08-08 7 views
2

Also habe ich ein Problem, wo meine Regex wie folgt aussieht: /true|false/.Ruby, True/False Regex

Wenn ich das Wort falsee überprüfe bekomme ich eine wahre von diesem Regex, gibt es eine Möglichkeit, es auf die genauen true oder Worte zu begrenzen?

Antwort

4

verwenden regex:

/^(true|false)$/ 

Es wird mit ^ und $ jeweils den Anfang und das Ende der Testzeichenfolge entsprechen, so kann nichts anderes in der Zeichenfolge (genaue Übereinstimmung) sein.

Siehe Live-Beispiel unter Regex101.

UPDATE (siehe @ w0lf's Kommentar): Die Klammern sollen die true|false-Klausel isolieren, damit sie nicht falsch gruppiert werden. (Dies stellt auch die true oder false Übereinstimmung in der ersten einfangenden Gruppe, aber da es scheint, dass Sie nur übereinstimmen und nicht erfassen eine Ausgabe, sollte dies keinen Unterschied machen).


Alternativ, wenn Sie einfach zwei Werte übereinstimmen möchten, gibt es in Ruby einfachere Möglichkeiten. @SimoneCarletti schlägt einen vor. Sie können auch die grundlegenden Operatoren == oder eql? verwenden. Versuchen Sie das folgende Skript ausführen, um zu sehen, dass diese alle Arbeiten:

values = ["true", "false", "almosttrue", "falsealmost"] 
values.each do | value | 
    puts value 

    # these three are all equivalent 
    puts "match with if" if value == "true" || value == "false" 
    puts "match with equals?" if (value.eql? "true") || (value.eql? "false") 
    puts "match with regex" if /^(true|false)$/.match value 

    puts 
end 
+1

die auch 'truely' und' etwas false' passen würde. – GolfWolf

+0

@ w0lf Bearbeitet mit Erklärung. –

+0

Danke für die Info! – AlCode

3

Sie müssen die ^ und $ Anker verwenden:

/^(true|false)$/ 

Edit: Als Cary in den Kommentaren darauf hingewiesen, das Muster oben entspricht auch mehrzeiligen Strings, die eine Zeile mit true oder false enthalten. Um dies zu vermeiden, verwenden Sie die \A und \z Trennzeichen, die den Anfang und das Ende der Zeichenfolge übereinstimmen jeweils:

/\A(true|false)\z/ 
+1

Wahr, für Strings, die aus einer einzigen Zeile bestehen, können Sie entweder die End-of-Line-Anker ('^' und '$') oder die Enden von String-Ankern ('\ A' und' \ z') verwenden . Ich schlage vor, Sie verwenden das letztere, wenn Sie die Enden einer Schnur verankern. Indem Sie '^' und '$' hier verwenden, verewigen Sie den Irrglauben vieler Rubies, dass sie End-of-String-Anker sind. –

+0

Funktioniert wie ein Charme! Vielen Dank! – AlCode

+0

@CarySwoveland Danke! Ich habe meine Antwort aktualisiert. – GolfWolf

2

ausprobieren

/^(true|false)$/ 

wo^der Anfang einer Zeile ist und $ Ende.

2

können Sie verwenden

/^(true|false)$/ 

oder noch besser

/\A(true|false)\z/ 

, die den Anfang und das Ende der Schnur (statt Linie) wird übereinstimmen. Wenn Sie nur für dessen Worte passen müssen, kann es effizienter sein, ein einfaches Array zu verwenden und include?:

%w(true false).include?(value)