2017-09-21 5 views
0

Ich versuche, eine Regex zu machen, die für die XXXXRCYYYYMMDDnnnnnnnn Zeichenfolge funktioniert.Regulärer Ausdruck für XXXXRCYYYYMMDDnnnnnnnn

Ich versuchte

^[A-Z]{6}(?<!\\d)(?:(?:20\\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:20(?:0[48]|[2468][048]|[13579][26]))0229)|(?:20\\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\\d|2[0-8]))(?!\\d){8}([\\d]{8}$ 

XXXXRC sind 6 Zeichen und YYYYMMDD ist Datum und n die beliebige Zahlen.

Diese sucht zuerst 6 Zeichen und dann für YYYYMMDD und dann nach 8 Zahlen suchen.

Es funktioniert nicht.

+2

Sie sollten angeben, was Sie mit Ihrer Formatzeichenfolge meinen. Was sind X, R, C, Y, M, D und n? –

+0

@Student Ich habe die Frage bearbeitet. – Sunny

+0

Also, 'XXXXRC' sind alle Buchstaben? Oder nur '[A-Z]'? Und 'n' sind Ziffern,' \ d'? Was ist falsch daran, nur '\ p {L} {6} \ d {14}' zu haben? Das würde sogar Unicode-Zeichen unterstützen. –

Antwort

1

Option 1:

Verwenden Gruppen erfassen, die Werte zu brechen, dann überprüfen Sie die Werte innerhalb der einfangenden Gruppen, wenn sie ein gültiges Datum überein:

^([\w]{4})([\w]{2})([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{8})$ 

Dies wird wie etwas entsprechen: ABCDZY19991231 in die folgenden Gruppen:

(ABCD)(ZY)(1999)(12)(31)() 
^ ^^ ^^^
|  | |  | | | 
|  | |  | | group 5 
|  | |  | group 4 
|  | |  group 3 
|  | group 2 
|  group 1 
group 0 

In diesem Fall würden die Gruppen 2, 3 und 4 die Datumskomponenten bilden. Sie können diesen regulären Ausdruck mit einem der vielen Online-RegEx-Tester testen und validieren, z. B. regex101.com. 2

Option:

den oben beschriebenen Ansatz nehmen, aber mehr kreativ mit den Zahlen Einfanggruppen bekommen, um nur die gewünschten Datumsbereiche zu umfassen. Siehe Matching Numeric Ranges with a Regular Expression:

Beispiele aus der oben genannten Seite:

  • 000..255: ^([01][0-9][0-9]|2[0-4][0-9]|25[0-5])$
  • 0 oder 000..255: ^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$
  • 0 oder 000..127: ^(0?[0-9]?[0-9]|1[01][0-9]|12[0-7])$
  • 0.999: ^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$

Dieser Ansatz ist jedoch sehr schwierig zu warten und sollte nur verwendet werden, wenn Sie Option 1 nicht alleine verwenden können.