2016-08-09 73 views
0

Ich möchte eine Regex eine Aufzählung von Versionen durch Semikolons getrennt übereinstimmen. Auch hier darf eine Version nicht erwähnt werden.Bessere Regex-Übereinstimmung?

Beispiele für Eingabe:

12.1.01;;;1.3.400;12-3;5;;;;;;4,5 
12.5 
;;;13,7;;15-12.300 

Mindestens eine Version sollte zwischen Semikolons erwähnt werden. Anzahl der Versionen kann beliebig sein.

Derzeit scheint diese Regex zu tun, was ich will:

regex="^\;*([0-9]+([\.\,\-]{1}[0-9]+)*)+(\;|([0-9]+([\.\,\-]{1}[0-9]+)*))*$" 

Andere Lösungen?

+0

'Auch gibt kein version.' und' Mindestens eine Version erwähnt werden können, sollte zwischen semicolons.' erwähnt werden, scheinen widersprüchlich zu sein ... – Skogsv

+0

Entschuldigung. In der Tat kann dies verwirrend sein. Ich meine, mindestens eine Version sollte mindestens zwischen allen Semikola erwähnt werden. ;;;;;;;;;;;;;; -> Dies ist ungültig und sollte nicht gefunden werden, da eine Version fehlt. Aber es ist nicht erforderlich, eine Version zwischen allen Semikola wie folgt zu sein: 12.3; 9-123.25; 34,5; 123.3.4 – softwareRat

Antwort

2

Wenn Sie nach etwas in den Semikolons suchen, die Regex

([^;]+) 

sollte es tun. Es wird so lange Sequenzen wie möglich von Symbolen entsprechen, die nicht ;

Die Regex sind:

([^;\n\r]+) 

wird auch separate Version Namen, die ohne Semikolons zwischen ihnen auf verschiedenen Reihen sind.

+2

Eine geringfügige Korrektur: Es sollte '([^; \ n \ r] +)' sein. Ihr 'Regex' akzeptiert auch die' leeren Strings' wie '' ''. – jbsu32

+0

Absolut richtig, mein Fehler! Jetzt bearbeitet. – Skogsv

-1

würde ich eine Verwendung für über die Versionen iterieren, etwa so:

IFS=';' 
for x in string 
do 
    version = $x 
done 

Genau wie eine manuelle Aufteilung der klassischen Programmiersprachen.

+0

Dies ist, was ich tun möchte, nachdem ich die Eingabe validiert habe. Ich bevorzuge es, es vorher zu validieren, um meine Schleife zu starten, wo ich für jede gefundene Version Logik hinzufügen werde. Wie auch immer, ich werde dies berücksichtigen. Vielen Dank. – softwareRat

0

Dieses Muster entspricht einer Linie, wenn es gültig ist

/^(;*((\d+)\.)*?(\d+);*)*$/ 

Dieses Muster passt alles nicht;

/[^;]+/g 

Dieses Muster findet eine Version:

/(\d+\.)*\d+/ 
+0

Minor: Sie scheinen in der letzten Regex "." Zu entkommen. Gegenwärtig wird es z.B. '123; 456'. – Skogsv

+0

@Skogsv ty - behoben – Error404