Mit regexp_replace können Sie einfache Anführungszeichen um Zeichenfolgen, aber nicht innerhalb von Wörtern ersetzen. Dies ist beispielsweise nicht möglich.

Mit regexp_replace können Sie einfache Anführungszeichen um Zeichenfolgen, aber nicht innerhalb von Wörtern ersetzen. Dies ist beispielsweise nicht möglich.

Ich verwende den folgenden Code aus einem Bash-Skript, um einfache Anführungszeichen in meiner Titelspalte in einer Postgres-Datenbank durch Leerzeichen zu ersetzen.

psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"

Mein Problem besteht darin, dass ich die einfachen Anführungszeichen um Zeichenfolgen entfernen wollte, beispielsweise folgendermaßen:

this is example 'number one' ok

wird

this is example  number one  ok 

Dies funktioniert wie erhofft. Allerdings werden dabei auch die einfachen Anführungszeichen innerhalb von Wörtern entfernt, also:

can't

wird

can t

Wie kann ich angeben, dass ich nur die einfachen Anführungszeichen um Zeichenfolgen ersetzen möchte?

Antwort1

Ich glaube nicht, dass es eine gute Möglichkeit gibt, dies mit nur einem Ersatz zu tun. Aber wenn vier Ersatzteile in Ordnung sind, gehen Sie wie folgt vor:

  1. Ersetzen \A'durch  (d. h. 'am Anfang der Zeichenfolge ersetzen).

  2. Ersetzen '\Zdurch  (d. h. 'am Ende der Zeichenfolge ersetzen).

  3. Globales Ersetzen ([^[:alnum:]])'durch  \1(d. h., jede Folge nicht alphanumerischer Zeichen und wird 'durch die nicht alphanumerischen Zeichen und ersetzt ).

  4. Global ersetzen '([^[:alnum:]])durch  \1(d. h., jede Folge von 'und einem nicht alphanumerischen Zeichen durch  und das nicht alphanumerische Zeichen ersetzen.)

Der Nettoeffekt besteht darin, alle zu ersetzen ', außer denen, die vorangestellt sindUndgefolgt von einem alphanumerischen Zeichen.

Haftungsausschluss: Ich habe keine Ahnung von PostgreSQL; Sie müssen es selbst in die PostgreSQL-Syntax übersetzen.

Antwort2

Verwenden Sie einen intelligenteren regulären Ausdruck: Wenn Sie " '" und " '" ( SPACE APOSTROPHEund APOSTROPHE SPACE) ersetzen, entfallen die Apostrophe innerhalb des Wortes.

Antwort3

Wenn Sie Apostrophe in Wörtern vermeiden möchten, suchen Sie nach Apostrophen, die links oder rechts keinen Buchstaben haben. Ein möglicher regulärer Ausdruck zum Suchen nach solchen Apostrophen könnte sein

([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])

oder kürzer

\'([^A-Za-z])|([^A-Za-z])\'

oder noch kürzer

\'([^\w])|([^\w])\'

Ich denke, regexp_replace wäre

regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')

Ich bin nicht vertraut mit psql, daher könnte die richtige Syntax sein

regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')

verwandte Informationen