PostgreSQL返回失败与REGEXP_REPLACE

我正在运行PostgreSQL 9.4,并将大量logging插入到我的数据库中。 插入后,我使用RETURNING子句进一步使用。

当我简单地运行:

... RETURNING my_car, brand, color, contact 

一切正常,但如果我尝试使用REGEXP_REPLACE失败:

 ... RETURNing my_car, brand, color, REGEXP_REPLACE(contact, '^(\+?|00)', '') AS contact 

它失败:

 ERROR: invalid regular expression: quantifier operand invalid 

如果我直接在PostgreSQL中直接运行查询,它可以工作并返回一个很好的输出。

试图重现和失败:

 t=# create table s1(t text); CREATE TABLE t=# insert into s1 values ('+4422848566') returning REGEXP_REPLACE(t, '^(\+?|00)', ''); regexp_replace ---------------- 4422848566 (1 row) INSERT 0 1 

所以阐述@pozsbuild议的理由是:

 set standard_conforming_strings to off; 

导致

 WARNING: nonstandard use of escape in a string literal LINE 1: ...alues ('+4422848566') returning REGEXP_REPLACE(t, '^(\+?|00)... ^ HINT: Use the escape string syntax for escapes, eg, E'\r\n'. ERROR: invalid regular expression: quantifier operand invalid 

更新由于OP的作者说standard_conforming_strings是从默认使用psql从9.1假设,并与pg-prommise

从重要的更新

这个问题很简单,就是JavaScript文字的转义,而不是标志。

他在答复中进一步阐述

环境variablesstandard_conforming_strings的当前值在这里是不重要的。 你可以看到它,如果你用SET standard_conforming_strings = true;前缀查询SET standard_conforming_strings = true; ,这将不会改变。

传递从客户端未转义的regExstring与从命令行使用E前缀相同: E'^(\+?|00)'

在JavaScript中,被视为一个特殊符号,并且只需要提供\\来指示符号,这正是您正则expression式所需要的。

除此之外, pg-promise会正确地将所有内容都清除掉,下面是一个例子:

 db.any("INSERT INTO users(name) VALUES('hello') RETURNING REGEXP_REPLACE(name, $1, $2)", ['^(\\+?|00)', 'replaced']) 

要理解命令行如何工作,请在E :前面加正则expression式string:

 db.any("INSERT INTO users(name) VALUES('hello') RETURNING REGEXP_REPLACE(name, E$1, $2)", ['^(\\+?|00)', 'replaced']) 

你会得到同样的错误: invalid regular expression: quantifier operand invalid