2017-12-25 7 views
1

Ich muss einige Zeichenfolge in PostgreSQL auf ',', aber nicht auf '\,' (Backslash ist Escape-Zeichen). Zum Beispiel muss regexp_split_to_array('123,45,67\,89', ???) die Zeichenfolge in Array {123, 45, "67\,89"} teilen.Regulärer Ausdruck Ausschluss in PostgreSQL

Was bereits getan: E'(?<!3),' arbeitet mit '3' als Escape-Zeichen. Aber wie kann ich den Backslash anstelle von 3 verwenden?

funktioniert nicht:

E'(?<!\),' nicht die Zeichenfolge an allen

E'(?<!\\),' wirft Fehler "Klammern() nicht ausgeglichen" spaltet

E'(?<!\),' (mit Leerzeichen) teilt auf alle ',' einschließlich '\,'

E'(?<!\\),' (mit Leerzeichen) teilt sich auf alle ',' zu.

+0

Ist ein Literal Backslash in der Eingabe maskiert? Was ist die erwartete Ausgabe für "123,45,67 \\, 89"? –

+0

Bitte * immer * deklarieren Sie Ihre Version von Postgres. Und in diesem speziellen Fall auch die Einstellung für 'standard_conforming_strings'. Siehe: https://stackoverflow.com/a/12320729/939860 –

Antwort

4

Der Brief E vor dem Text bedeutet C-String und dann müssen Sie zweimal entkommen, eine für den C-String und einem für den regexp.

Versuchen mit und ohne E:

regexp_split_to_array('123,45,67\,89', '(?<!\\),') 
regexp_split_to_array('123,45,67\,89', E'(?<!\\\\),') 

http://rextester.com/VEE84838 Hier ein aktuelles Beispiel (unnest() ist nur für Zeile für Zeile Anzeige der Ergebnisse):

select unnest(regexp_split_to_array('123,45,67\,89', '(?<!\\),')); 
select unnest(regexp_split_to_array('123,45,67\,89', E'(?<!\\\\),')); 
0

Sie es auch aufspalten zu Gruppen zuerst:

(\ d +), (\ d + \, \ d +)?

(und später verketten sie mit Komma)