Frage Regex, wie man ein optionales Zeichen anpasst


Ich habe eine Regex, von der ich dachte, dass sie bis jetzt korrekt funktioniert. Ich muss auf ein optionales Zeichen abstimmen. Es kann da sein oder nicht.

Hier sind zwei Saiten. Die obere Saite wird angepasst, während die untere nicht übereinstimmt. Die Abwesenheit eines einzelnen Buchstabens in der unteren Zeichenkette ist der Grund dafür, dass es fehlschlägt.

Ich möchte den einzelnen Buchstaben nach den Anfangsziffern erhalten, wenn er da ist, und wenn nicht, fahre fort, den Rest der Zeichenfolge zu erhalten. Dieser Brief kann sein A-Z.

Wenn ich entferne ([A-Z]{1}) +.*? + Von der Regex wird alles passen, was ich brauche außer dem Brief, aber es ist wichtig.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Hier ist der Regex, den ich benutze.

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

76
2017-10-24 06:34


Ursprung


Antworten:


Benutzen

[A-Z]?

um den Brief optional zu machen. {1} ist überflüssig. (Natürlich könntest du auch schreiben [A-Z]{0,1} Das würde das Gleiche bedeuten, aber das ist was ? ist da für.)

Sie könnten Ihre Regex auf verbessern

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

Und da in den meisten Regex-Dialekten \d ist das gleiche wie [0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

Aber: Brauchen Sie wirklich 11 separate Erfassungsgruppen? Und wenn ja, warum erfassen Sie nicht die viertletzte Zifferngruppe?


142
2017-10-24 06:44



Sie können den einzelnen Buchstaben optional machen, indem Sie ein hinzufügen ? danach als:

([A-Z]{1}?)

Der Quantifizierer {1} ist überflüssig, so dass Sie es fallen lassen können.


13
2017-10-24 06:42



Sie müssen den einzelnen Buchstaben auch als optional markieren:

([A-Z]{1})? +.*? +

oder machen Sie den ganzen Teil optional

(([A-Z]{1}) +.*? +)?

4
2017-10-24 06:44