2016-08-05 6 views
2

Ich habe eine Version 'major.minor.patch'
Hauptversionsbereich [0-99999]
Minor-Versionsbereich [0-9999]
Patch-Version Bereich [0-999999]
aber im Großen und Ganzen ‚major.minor .path 'sollte nicht länger als 16 Zeichen sein. (Punkt). Ich habe folgende reg Ausdruck versuchtregex die Gruppenlänge in Python setzen

^(\d{1,5}[.]\d{1,4}[.]\d{1,6}){1,16}$ 

aber {1,16} bedeutet 1 bis 16 Wiederholungen früherer Ausdruck nicht die Länge der vorherigen Gruppe Wie kann ich die Länge der folgenden Gruppe bis 16

machen wenn es innerhalb von 1-16 Bereich
(\d{1,5}[.]\d{1,4}[.]\d{1,6}) 
+0

Sind Sie sicher, dass Sie dies brauchen, um eine einzige Regex zu sein? Es wäre einfacher, wenn Ihre Regex "(\ d +) [.] (\ D +) [.] (\ D +)" wäre und Sie dann die Reste der Checks getrennt machen (sehen Sie, ob Versionsbereiche korrekt sind und ob len (thestring) ist unter dem Limit) – hugomg

Antwort

2

Sie haben zwei reguläre Ausdrücke ihn re, dass Sie

  1. ^[\d.]{,16}$
  2. ^\d{1,5}[.]\d{1,4}[.]\d{1,6}$

Sowohl in sich selbst zu kombinieren, ist ungültig, da (1) mehr als 2 Punkte entsprechen und die einzelnen Längenbegrenzungen auf jeder Version werden nicht berücksichtigt. (2) funktioniert definitiv nicht, da es die Zeichenfolgenlänge von 16 Zeichen überschreitet, einschließlich '.'

Ein weniger bekanntes Merkmal von regex lookhead kann (und-ed) sowohl die oben Regex Ausdrücke zu kombinieren, verwendet werden, die so etwas wie

^(?=[\d.]{,16}$)\d{1,5}[.]\d{1,4}[.]\d{1,6}$ 

Beispiel wäre:

exp = r'^(?=[\d.]{,16}$)\d{1,5}[.]\d{1,4}[.]\d{1,6}$' 
vers = ['111.111.111', 
     '111111.1111.1111', 
     '11111.1111.111111', 
     '11111.1111.11111'] 
["{} Matches ? {}".format(v, "YES" if re.match(exp, v) else "NO") 
for v in vers] 

Ausgabe

['111.111.111 Matches ? YES', 
'111111.1111.1111 Matches ? NO', 
'11111.1111.111111 Matches ? NO', 
'11111.1111.11111 Matches ? YES'] 
+0

Dank Abhijit Regex Look Ahead löst das Problem. –

1

einen Look-Ahead am Anfang hinzufügen, die nur ein Spiel, indem Sie ein $ mit am Ende zu verankern: (?=^.{1,16}$)