Alle,
Ich stecke wieder fest und versuche, meine Daten in einem Format abzurufen, in dem ich sie benötige. Ich habe ein Textfeld, das so aussieht.
"Deangelo 001 Deangelo
lokale Herkunft des Namens: italain
vom amerikanischen Namen Deangelo
Bedeutung: der Engel
emotionales Spektrum • Er ist eine Quelle der Freude für alle.
persönliche Integrität • Sein guter Name ist sein wertvollstes Gut. Persönlichkeit • Es ist schwer, mit Adlern zu fliegen, wenn Sie von Truthähnen umgeben sind! Beziehungen • beginnen langsam, aber mit der Zeit baut sich eine Beziehung zu Deangelo auf. Reisen & Freizeit • Eine Reise seines Lebens liegt in seiner Zukunft.
Karriere & Geld • Als begabtes Kind muss Deangelo ständig herausgefordert werden.
Lebensmöglichkeiten • Freude und Glück erwarten diese gesegnete Person.
Deangelos Glückszahlen: 12 • 38 • 18 • 34 • 29 • 16
""
Was wäre der beste Weg in Postgresql, um die Wagenrückläufe und neuen Zeilen zu entfernen? Ich habe verschiedene Dinge ausprobiert und keiner von ihnen möchte sich verhalten.
select regexp_replace(field, E'\r\c', ' ', 'g') from mytable
WHERE id = 5520805582
SELECT regexp_replace(field, E'[^\(\)\&\/,;\*\:.\>\<[:space:]a-zA-Z0-9-]', ' ')
FROM mytable
WHERE field~ E'[^\(\)\&\/,;\*\:.\<\>[:space:]a-zA-Z0-9-]'
AND id = 5520805582;
Vielen Dank im Voraus, Adam
quelle
E
Präfix fallen lassen :'[\n\r]+'
. Viel sauberer aussehend, imo.'g'
ermöglicht hier ein vollständiger Austausch. Ohne sie werden Ersetzungen nur einmal pro "Zeile" durchgeführt, was in diesem Fall so ziemlich nur "nur einmal" bedeutet, da Postgres\n
s nicht als Zeilenumbruch zählt.select regexp_replace(field, E'[\\n\\r\\u2028]+', ' ', 'g' )
Ich hatte das gleiche Problem in meinem Postgres d / b, aber die fragliche Newline war nicht die traditionelle ASCII-CRLF, sondern ein Unicode-Zeilentrennzeichen, Zeichen U2028. Das obige Code-Snippet erfasst auch diese Unicode-Variation.
Update ... obwohl ich bisher nur auf die oben genannten Zeichen "in the wild" gestoßen bin , verwenden Sie Folgendes, um den Ratschlägen von lmichelbacher zu folgen, noch mehr Unicode-Zeilenumbrüche zu übersetzen :
select regexp_replace(field, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g' )
quelle
OP fragte speziell nach regulären Ausdrücken, da es den Anschein hat, dass es eine Reihe anderer Zeichen und Zeilenumbrüche gibt, aber für diejenigen, die nur Zeilenumbrüche entfernen möchten, müssen Sie nicht einmal zu einem regulären Ausdruck gehen. Sie können einfach tun:
select replace(field,E'\n','');
Ich denke, dies ist ein SQL-Standardverhalten, daher sollte es sich auf alle außer vielleicht den frühesten Versionen von Postgres erstrecken. Das obige wurde für mich in 9.4 und 9.2 gut getestet
quelle
replace
die exakte Übereinstimmung des zweiten Parameters ersetzt wird, nicht jedes Zeichen davon.Wenn Sie Zeilenumbrüche am Anfang oder Ende der Zeichenfolge entfernen müssen, können Sie Folgendes verwenden:
UPDATE table SET field = regexp_replace(field, E'(^[\\n\\r]+)|([\\n\\r]+$)', '', 'g' );
Denken Sie daran, dass der Hut
^
den Anfang der Zeichenfolge und das Dollarzeichen$
das Ende der Zeichenfolge bedeutet.Hoffe es hilft jemandem.
quelle