2017-07-24 3 views
1

Ich arbeite an einem regulären Ausdruck, um polnische Telefonnummern in einer langen Zeichenfolge zu finden. Es könnte +48, 0048, 48 (in Klammern auf nicht) gefolgt von 9 Ziffern mit Leerzeichen dazwischen sein.Regulärer Ausdruck für eine polnische Telefonnummer

Die erste Idee war:

(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3} 

Dies fängt Dinge wie +48 123 456 789 und 123456789 sondern auch zwei Telefonnummern in 1234567899876543211 finden - das ist nicht akzeptabel. So habe ich Wortgrenzen:

\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b 

Aber diese Regex, in einer Zeichenkette wie (+48) 123 456 789 nur 48) 123 456 789 erfassen wird. Warum wird der Anfang weggelassen?

(regex101 mit Beispielen, was passen sollte/sollte nicht überein)

+1

Sind die Leerzeichen immer in Dreiergruppen? –

+0

@WillemVanOnsem Ich bin OK mit einigen falschen Negativen, also ja, wir können diese Annahme machen. – maestromusica

+0

Das ist wegen einer Wortgrenze, verschieben Sie es zu den Ziffern. Vor den Nicht-Wort-Zeichen fügen Sie '\ B' hinzu. –

Antwort

2

Ihre \b(\(?(\+|00)?48\)?)?\[ -\]?\d{3}\[ -\]?\d{3}\[ -\]?\d{3}\b regex nicht übereinstimmen Recht vor, die optionalen Teile, weil die Wortgrenze obligatorisch war, während die optionalen Muster fehlen könnten. Z.B. Das Problem mit +48 123 456 789 Zeichenfolge (wo nur 48 123 456 789 wurde abgeglichen) war das Folgende: die ursprüngliche \b benötigt eine Wortgrenze, und es gab keine Wortgrenze vor +, so ging es weiter und fand 4 nach + - das ist, wo die Wortgrenze ist . Als nächstes ergab (+48) 123 456 789 nur 48) 123 456 789, weil die Wortgrenze nur zwischen + und 4 wiedergefunden wurde.

Anstatt mit den Wortgrenzen zu spielen, können Sie der Regex-Engine direkt mitteilen, dass nur die Strings übereinstimmen sollen, wenn ihnen kein Wort vorangestellt oder gefolgt wird.

Verwenden

(?<!\w)(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}(?!\w) 

Siehe regex demo

Die (?<!\w) negativen Lookbehind wird das Spiel nicht, wenn es ein Wort char auf der linken Seite des Spiels ist, und (?!\w) negative Vorschau wird das Spiel scheitern, wenn es ist ein Wort Char auf der rechten Seite des Spiels.

+0

Ich verstehe immer noch nicht, warum mein Ausdruck nicht funktionierte, aber deine Lösung löst das Problem sehr elegant :) – maestromusica

+1

Nun, ich fügte eine kleine Erklärung hinzu, warum der letzte im OP geteilte Regex nicht funktionierte. Die Erklärung, warum das Hinzufügen von Wortgrenzen vor optionalen Mustern nicht funktioniert, ist schwieriger: Der Punkt ist, dass Wortgrenzen obligatorisch sind, während das Muster dies nicht ist. Ich kann nur Word-Grenzen mit einem Conditional arbeiten lassen - siehe [diese Regex-Variante] (https://regex101.com/r/XtQlY1/1), wobei '(...)' matching ein bisschen besser ist (wird es nicht match, wenn es ein '(' oder '') '' gibt. –