wake-up-neo.com

Legen Sie fest, wie ein optionales Zeichen abgeglichen werden soll

Ich habe eine Regex, von der ich dachte, dass sie bis jetzt korrekt funktioniert hat. Ich muss auf einen optionalen Charakter passen. Es kann da sein oder nicht.

Hier sind zwei Saiten. Die obere Saite stimmt überein, die untere nicht. Das Fehlen eines einzelnen Buchstabens in der unteren Zeichenfolge führt dazu, dass es fehlschlägt.

Ich möchte den einzelnen Buchstaben nach den fünf Ziffern erhalten, wenn er vorhanden ist, und falls nicht, fahren Sie mit dem Rest der Zeichenfolge fort. Dieser Brief kann A-Z sein.

Wenn ich ([A-Z]{1}) +.*? + aus dem Regex entferne, wird alles mit dem übereinstimmen, was ich außer dem Buchstaben brauche, aber es ist irgendwie wichtig.

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

Hier ist die Regex, die ich verwende.

/^([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})/
88
jim

Benutzen

[A-Z]?

um den Brief optional zu machen. {1} ist redundant. (Natürlich könnten Sie auch [A-Z]{0,1} schreiben, was dasselbe bedeuten würde, aber dafür ist ? da.)

Sie könnten Ihre Regex 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 derselbe ist 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: Benötigen Sie wirklich 11 separate Fanggruppen? Und wenn ja, warum erfassen Sie nicht die viertletzte Zifferngruppe?

168
Tim Pietzcker

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

([A-Z]{1}?)

Der Quantifizierer {1} ist redundant, sodass Sie ihn löschen können.

15
codaddict

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

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

oder machen Sie das Ganze optional

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

Sie könnten auch einfachere reguläre Ausdrücke verwenden, die für Ihren Fall entwickelt wurden, wie (.*)\/(([^\?\n\r])*), wobei $2 Ihren Wünschen entspricht.

0
robinvrd