AnforderungRegex zu verschiedenen Gruppen entsprechen je nach String Inhalt
Ich habe eine Postgres-Spaltenwerte in zwei Formen enthalten: Namen persönliche und Corporate. Persönliche Namen enthalten ein Komma, während Firmennamen dies nicht tun.
_owner_titlecase
-------------------------
McCartney, James Paul
Lennon, John Winston Ono
Harrison, George
Starkey, Richard
The Beatles
Ich habe eine Abfrage zu erzeugen, die nur die persönlichen Namen abkürzt, wie folgt aus:
regexp_replace
-------------------------
McCartney, J P
Lennon, J W O
Harrison, G
Starkey, R
The Beatles
Hintergrund
Nach einigen Leistungstests, erkannte ich, habe ich kann nicht Verwenden Sie CASE
, um die zwei Zeilentypen anders zu behandeln (wie in CASE WHEN _owner_titlecase ~ ',' regexp_replace...
). Ich hoffe also, dass es einen Weg gibt, eine einzige Regex zu schreiben, die beide Arten unterschiedlich behandeln kann.
ich previously asked darüber, wie der Initialen Namensbestandteil zu handhaben, und jetzt sind mit (^\w+)|\Y\w
Regex wie folgt:
, regexp_replace(_owner_titlecase
, '(^|;\s+)(\w+)|\Y\w'
, '\1', 'g')
Jetzt habe ich den Umfang weitet sie bei den Firmennamen zu suchen, natürlich The Beatles
wird abgekürzt zu The B
.
Die \Y
ist eine Postgres regex Zeichenklasse, die ich über here gelernt habe, die nur an einem Punkt übereinstimmt, der nicht der Anfang oder das Ende eines Wortes ist. Während die speziellen Postgres-Klassen so aussehen, als könnten sie in dieser Situation nützlich sein, wäre es eigentlich nützlich, bei Regex-Features zu bleiben, die universell sind, so dass ich sie an Orten wie regex101.com testen kann. Derzeit sind meine einzigen Postgres-Testplattformen etwas peinlich und bieten keine Debugging-Hilfe.
Die ganze Geschichte ist, dass wir eine CartoDB-Karte haben, auf der wir eine Ebene überlagern wollen, die Eigentümernamen enthält. Einige Eigenschaften liegen nahe beieinander, und die Liste der Eigentümernamen kann lang sein, weshalb die Abkürzung erforderlich ist.
Ich glaube, dass Sie '^ ([^,] *) $ | (^ |; \ s +) (\ w +) | \ Y \ w' Muster verwenden und durch' '\ 1 \ 2 \ 3'' ersetzen können –
Nochmals vielen Dank @Wictor. Dies funktioniert für die meisten persönlichen Namen. Es bringt O'Brien, John Andrew nicht ganz recht. – OutstandingBill
Ich verstehe das Problem vielleicht nicht richtig, aber konnte man nicht einfach mit einer 'where'-Anweisung filtern, wie' WHERE name LIKE%,% ' – Fallenhero