2016-08-03 6 views
2

es meine folgende regex:Live-Eingabevalidierung von 4-stellige Präfixen mit optional 8 Ziffern am Ende

/^08(17|18|19|31|32|33|38|59|77|78)[0-9]{0,8}$/ 

wenn ich setzte 08 in Eingabefeld wird Bekanntmachung Fehler zeigt, was ich will, ist, wenn ich Eingang 0817 wird Erfolg zeigen, wenn ich 08 eingäbe, will ich nicht bemerken, dass Fehler angezeigt wird. Vielleicht ist die Lösung zu verwenden nicht erfassen Gruppe in Regex. aber wie geht das?

es ist mein Präfix Validierung, was ich will:

0817, 0818, 0819, 0831, 0832, 0833, 0838, 0859, 0877, 0878 
+0

Können Sie uns die gesamte Bandbreite dessen zeigen, was Sie zu erreichen versuchen? Ihr aktueller Regex passt auch nicht zu "0817". –

+0

Ich denke, '08' sollte Teil des Wechsels sein:'/^ (08 | 17 | 18 | 19 | 31 | 32 | 33 | 38 | 59 | 77 | 78) [0-9] {0,8} $/'? Am besten verwenden Sie '/^(08 | 1 [7-9] | 3 [1238] | 59 | 7 [78]) [0-9] {0,8} $ /'. –

+0

Sie sollten diese Frage mit relevanten Fortschritten und Details aktualisieren, anstatt [doppelte Fragen] (http://stackoverflow.com/questions/38740717/prefix-validation-with-regular-expression) zu posten. Jetzt, ich sehe, müssen Sie "08" und dann nur die zweistelligen Stücke aus der Gruppe zulassen. Probiere ['^ 08 (? :(?: 17 | 18 | 19 | 31 | 32 | 33 | 38 | 59 | 77 | 78) [0-9] {0,8})? $'] (Https://regex101.com/r/xC7mT4/3). Oder eine effizientere ['^ 08 (? :(?: 1 [789] | 3 [1-38] | 59 | 7 [78]) [0-9] {0,8})? $'] (Https : //regex101.com/r/xC7mT4/4). Wenn dies so funktioniert, wie Sie es erwarten, hinterlassen Sie bitte einen Kommentar, damit ich eine Antwort mit Erklärungen schreiben kann. –

Antwort

1

Sie möchten eine Live-Eingabevalidierung für Ihre Codes implementieren, die von 4-stelligen Satz Präfixe bestehen und dann 0-8 beliebigen Stellen.

Der Punkt ist, dass Sie nicht die Subpattern optional machen können sequentiell, müssen Sie verschachtelte optionale Gruppen verwenden, um eine linke Ziffer erfordern eine vorhanden, bevor die rechte Seite zu sein.

Das Muster wird eher unordentlich, aber das ist der einzige Weg, es funktioniert:

^0(?:8(?:1(?:[789][0-9]{0,8})?|3(?:[1238][0-9]{0,8})?|5(?:9[0-9]{0,8})?|7(?:[78][0-9]{0,8})?)?)?$ 

Siehe regex demo

Einzelheiten:

  • ^ - Beginn der Zeichenfolge
  • 0 - ein obligatorischer 0
  • (?:
    • 8 - obligatorische 8
      • (?:
      • 1 - obligatorische 1 gefolgt von ...
      • (?: - eine optionale Gruppe passende entweder ...
        • [789] - 7 oder 8 oder 9 gefolgt mit
        • [0-9]{0,8} - 0 bis 8 irgendwelche digits
      • )? - (Ende der optionale Gruppe nach 1)
      • | - oder
      • 3(?:[1238][0-9]{0,8})? - (ähnlich wie oben)
      • | - oder
      • 5(?:9[0-9]{0,8})? - (ähnlich wie oben)
      • | - oder
      • 7(?:[78][0-9]{0,8})? - (ähnlich wie oben)
    • )? - Ende der optional Gruppe der 8 passende und alle danach
  • )? - der ganze Teil nach dem ersten 0 ist optional.
  • $ - Ende der Zeichenfolge.
+1

nette Arbeit dude thx du es Arbeit ist –

+0

Es sieht aus wie ich eine zusätzliche, redundante Gruppe hatte, entfernt und zusätzliche Erklärung. –

+1

sehr nett, danke, Bruder –

0

Sie brauchen keine Nicht-Erfassung Gruppe. Sie benötigen nur ? für ein optionales Vorkommen. Es gilt als gültig für 0 oder 1 Auftreten.

/^08(17|18|19|31|32|33|38|59|77|78)?[0-9]{0,8}$/ 

Beweisen: https://regex101.com/r/xC7mT4/1

+0

wenn ich 08 immer noch bekannt gegeben Fehler –

+0

habe ich die Antwort mit einer Validierung beweisen aktualisiert. Vielleicht sollten Sie den Fehler hier für uns kopieren, um zu sehen –