[Ruby] Regular Expression für Versionen

Bender86

Lieutenant
Registriert
Jan. 2007
Beiträge
718
Moin moin,

ich habe mir einen Regulären Ausdruck für Versionsnummern gebastelt, mit dem ich einen Text nach Versionen durchsuchen will. Dabei soll er alles matchen was mit "Zahl Punkt Zahl" anfängt und dahinter beliebige Zeichen bis zu einem Leerzeichen oder Ende des Textes hat. Also zum Beispiel:

"1.8 hier kommt irgend 1.1.2a ein Text 2.0ubuntu4"

Hier sollte "1.8 ", " 1.1.2a ", "2.0ubuntu4" gematcht werden.

Mein Regexp sieht so aus: (\s+|\A)\d[.]\d\S*(\s+|\z)

Nun zum Problem, wenn ich diesen Ausdruck bei www.rubular.com auf den Beispieltext anwende, werden die richtigen Stellen markiert.

Wenn ich jedoch im IRB arbeite sieht es dann so aus:

Code:
ruby-1.9.2-p0 > VERSION_REGEXP = /(\s+|\A)\d[.]\d\S*(\s+|\z)/
 => /(\s+|\A)\d[.]\d\S*(\s+|\z)/ 
ruby-1.9.2-p0 > text = "1.8 hier kommt irgend 1.1.2a ein Text 2.0ubuntu4"
 => "1.8 hier kommt irgend 1.1.2a ein Text 2.0ubuntu4" 
ruby-1.9.2-p0 > text.scan(VERSION_REGEXP)
 => [["", " "], [" ", " "], [" ", ""]]

Ich habe neben scan schon match und split probiert, die liefern aber auch nicht das gewünschte Ergebnis (ein Array mit allen Treffern).

Ist scan hierfür die falsche Methode? Laut Doku und Tests mit anderen Ausdrücken sollte es eigentlich funktionieren. Kann mir jemand erklären warum das Ergebnis - Array mit leeren Strings / mit Leerzeichen - so seltsam ist?

Viele Grüße,
Bender
 
Rubular ist Version 1.8.7 und du hast Version 1.9.2! Vielleicht hat sich ja da was bei den Versionen geändert!
 
Daran liegt es leider nicht. Ich hab es eben unter Ruby 1.8.7 probiert da kommt dasselbe raus.
Ergänzung ()

Ich hab nun herausgefunden wie es funktioniert, falls mal jemand auf der Suche nach einem ähnlichen Problem auf den Thread stolpert:

Eine Lösung ist es Klammern um den gesamten Regexp zu setzen:

Code:
text.scan(/((\s+|\A)\d[.]\d\S*(\s+|\z))/)
 => [["1.8 ", "", " "], [" 1.1.2a ", " ", " "], [" 2.0ubuntu4", " ", ""]]

Es geht aber noch wesentlich einfacher und schöner, wodurch die leeren Strings/Leerzeichen rausfliegen:

Code:
text.scan(/\b\d\.\d\S*\b/)
 => ["1.8", "1.1.2a", "2.0ubuntu4"]

Und da ich eigentlich auch zweistellige Versionen matchen wollte:

Code:
ruby-1.9.2-p0 > text += " emacs 21.3a"
 => "1.8 hier kommt irgend 1.1.2a ein Text 2.0ubuntu4 emacs 21.3a" 
ruby-1.9.2-p0 > text.scan(/\b\d+\.\d+\S*\b/)
 => ["1.8", "1.1.2a", "2.0ubuntu4", "21.3a"]
 
Zurück
Oben