Ich habe eine Versionsnummer des folgenden Formulars:
version.release.modification
Dabei sind Version, Freigabe und Änderung entweder eine Reihe von Ziffern oder das Platzhalterzeichen '*'. Außerdem kann eine dieser Nummern (und alle vorhergehenden) fehlen.
Folgendes ist also gültig und wird analysiert als:
1.23.456 = version 1, release 23, modification 456
1.23 = version 1, release 23, any modification
1.23.* = version 1, release 23, any modification
1.* = version 1, any release, any modification
1 = version 1, any release, any modification
* = any version, any release, any modification
Diese sind aber nicht gültig:
*.12
*123.1
12*
12.*.34
Kann mir jemand einen nicht allzu komplexen regulären Ausdruck zur Validierung und zum Abrufen der Versions-, Versions- und Änderungsnummern zur Verfügung stellen?
regex
versioning
Andrew Borley
quelle
quelle
Antworten:
Ich würde das Format wie folgt ausdrücken:
Als regulärer Ausdruck ist das:
[Zum Hinzufügen bearbeiten: Diese Lösung ist eine übersichtliche Methode zur Validierung. Es wurde jedoch darauf hingewiesen, dass das Extrahieren der Werte zusätzliche Arbeit erfordert. Es ist Geschmackssache, ob man damit umgeht, indem man den regulären Ausdruck kompliziert oder die übereinstimmenden Gruppen verarbeitet.
In meiner Lösung erfassen die Gruppen die
"."
Charaktere. Dies kann mit nicht erfassenden Gruppen wie in Ajborleys Antwort behandelt werden.Außerdem erfasst die Gruppe ganz rechts die letzte Komponente, selbst wenn weniger als drei Komponenten vorhanden sind. So führt beispielsweise eine Eingabe mit zwei Komponenten dazu, dass die erste und die letzte Gruppe erfasst werden und die mittlere Gruppe undefiniert ist. Ich denke, dies kann von nicht gierigen Gruppen behandelt werden, wenn dies unterstützt wird.
Perl-Code zur Behebung beider Probleme nach dem regulären Ausdruck könnte ungefähr so aussehen:
Was nicht wirklich kürzer ist als das Aufteilen
"."
]quelle
Verwenden Sie Regex und jetzt haben Sie zwei Probleme. Ich würde das Ding in Punkte (".") Aufteilen und dann sicherstellen, dass jeder Teil entweder ein Platzhalter oder ein Satz von Ziffern ist (Regex ist jetzt perfekt). Wenn das Ding gültig ist, geben Sie einfach den richtigen Teil des Split zurück.
quelle
Dies könnte funktionieren:
Auf der obersten Ebene ist "*" ein Sonderfall einer gültigen Versionsnummer. Ansonsten beginnt es mit einer Nummer. Dann gibt es null, eins oder zwei ".nn" -Sequenzen, gefolgt von einem optionalen ". *". Diese Regex würde 1.2.3. * Akzeptieren, was in Ihrer Anwendung möglicherweise zulässig ist oder nicht.
Der Code zum Abrufen der übereinstimmenden Sequenzen, insbesondere des
(\.\d+){0,2}
Teils, hängt von Ihrer speziellen Regex-Bibliothek ab.quelle
Vielen Dank für alle Antworten! Das ist Ass :)
Basierend auf der Antwort von OneByOne (die für mich am einfachsten aussah), fügte ich einige nicht erfassende Gruppen hinzu (die '(?:' - Teile - danke von VonC für die Einführung in nicht erfassende Gruppen!), Also die Gruppen, die nur erfassen enthalten die Ziffern oder * Zeichen.
Vielen Dank an alle!
quelle
(\*|\d+)
nicht von der ersten^(?:(\d+)\.)?
Gruppe abgeglichen wird .Meine 2 Cent: Ich hatte dieses Szenario: Ich musste Versionsnummern aus einem String-Literal analysieren. (Ich weiß, dass dies sehr anders ist als die ursprüngliche Frage, aber beim Googeln, um einen regulären Ausdruck für das Parsen der Versionsnummer zu finden, wurde dieser Thread oben angezeigt. Fügen Sie diese Antwort hier hinzu.)
Das String-Literal wäre also ungefähr so: "Service-Version 1.2.35.564 wird ausgeführt!"
Ich musste den 1.2.35.564 aus diesem Literal heraus analysieren. Ausgehend von @ajborley lautet mein Regex wie folgt:
Ein kleines C # -Schnipsel zum Testen sieht wie folgt aus:
quelle
X.Y.Z
(also genau drei Teile), wobei X und Y nicht negative ganze Zahlen sein müssen und nein zusätzliche führende Nullen. Siehe semver.org .Sie wissen nicht, auf welcher Plattform Sie sich befinden, aber in .NET gibt es die System.Version-Klasse, die Versionsnummern von "nnnn" für Sie analysiert.
quelle
Ich stimme eher dem geteilten Vorschlag zu.
Ich habe einen "Tester" für Ihr Problem in Perl erstellt
Aktueller Output:
quelle
Dies sollte für das funktionieren, was Sie festgelegt haben. Es hängt von der Platzhalterposition ab und ist eine verschachtelte Regex:
quelle
Ich habe viele Antworten gesehen, aber ... ich habe eine neue. Das funktioniert zumindest bei mir. Ich habe eine neue Einschränkung hinzugefügt. Versionsnummern können nicht mit Nullen gefolgt von anderen beginnen (Major, Minor oder Patch).
Es basiert auf einem früheren. Aber ich sehe diese Lösung besser ... für mich;)
Genießen!!!
quelle
Noch ein Versuch:
Dies ergibt die drei Teile in Gruppen 4,5,6 ABER: Sie sind nach rechts ausgerichtet. Die erste Nicht-Null-Zahl von 4,5 oder 6 gibt also das Versionsfeld an.
quelle
Vielleicht könnte eine prägnantere sein:
Dies kann dann auf 1.2.3.4.5. * Erweitert oder mit * oder {2} anstelle von {0,2} genau auf XYZ beschränkt werden.
quelle
Ich musste nach Versionsnummern suchen / übereinstimmen, die der Maven-Konvention oder sogar nur einer Ziffer entsprechen. Aber auf keinen Fall ein Qualifier. Es war eigenartig, es hat einige Zeit gedauert, bis ich darauf gekommen bin:
Dies stellt sicher, dass die Version,
Ein Nachteil ist, dass die Version sogar mit '.' Beenden kann. Aber es kann eine unbestimmte Länge der Version verarbeiten (verrückte Versionierung, wenn Sie es so nennen wollen)
Streichhölzer:
Wenn Sie mit '.' Nicht unzufrieden sind. Ende, vielleicht können Sie mit Enden mit Logik kombinieren
quelle
(\d+)(.\d+)*
Entspricht genau Ihren 6 ersten Beispielen und lehnt die 4 anderen ab
Sie können '(? Ms)' entfernen.
Ich habe es verwendet, um anzuzeigen, dass dieser reguläre Ausdruck über QuickRex auf mehrere Zeilen angewendet werden soll
quelle
Dies entspricht auch 1.2.3. *
Ich würde das weniger elegante vorschlagen:
(* | \ d + (. \ d +)? (. *)?) | \ d +. \ d +. \ d +)
quelle
Denken Sie daran, dass reguläre Ausdrücke gierig sind. Wenn Sie also nur innerhalb der Versionsnummer und nicht in einem größeren Text suchen, markieren Sie mit ^ und $ den Anfang und das Ende Ihrer Zeichenfolge. Der reguläre Ausdruck von Greg scheint gut zu funktionieren (habe ihn in meinem Editor nur kurz ausprobiert), aber abhängig von Ihrer Bibliothek / Sprache kann der erste Teil immer noch mit dem "*" innerhalb der falschen Versionsnummern übereinstimmen. Vielleicht fehlt mir etwas, da ich Regexp seit ungefähr einem Jahr nicht mehr verwendet habe.
Dies sollte sicherstellen, dass Sie nur die richtigen Versionsnummern finden können:
^ (\ * | \ d + (\. \ d +) * (\. \ *)?) $
edit: eigentlich hat greg sie schon hinzugefügt und sogar seine lösung verbessert, ich bin zu langsam :)
quelle
Es scheint ziemlich schwierig zu sein, einen regulären Ausdruck zu haben, der genau das tut, was Sie wollen (dh nur die Fälle akzeptieren, die Sie benötigen, und alle anderen ablehnen und einige Gruppen für die drei Komponenten zurückgeben). Ich habe es ausprobiert und mir Folgendes ausgedacht:
IMO (ich habe nicht ausführlich getestet) sollte dies als Validator für die Eingabe gut funktionieren, aber das Problem ist, dass diese Regex keine Möglichkeit zum Abrufen der Komponenten bietet. Dafür müssen Sie noch einen Split-On-Zeitraum durchführen.
Diese Lösung ist nicht all-in-one, muss aber in der Programmierung meistens nicht. Dies hängt natürlich von anderen Einschränkungen ab, die Sie möglicherweise in Ihrem Code haben.
quelle
Angeben von XSD-Elementen:
quelle
Ich nehme das als eine gute Übung - vparse , die eine winzige Quelle hat , mit einer einfachen Funktion:
quelle
Noch eine Lösung:
quelle
Zum Parsen von Versionsnummern, die diesen Regeln folgen: - Sind nur Ziffern und Punkte - Kann nicht mit einem Punkt beginnen oder enden - Kann nicht zwei Punkte zusammen sein
Dieser hat mir den Trick angetan.
Gültige Fälle sind:
1, 0,1, 1.2.1
quelle