PostgreSQL中的正则表达式替换
我有一个表,其中一个特定的字符串字段通常包含unicode,用于其中的单引号和双引号:PostgreSQL中的正则表达式替换,sql,regex,postgresql,replace,Sql,Regex,Postgresql,Replace,我有一个表,其中一个特定的字符串字段通常包含unicode,用于其中的单引号和双引号:\u0027和\u0022。事实证明,我更需要他们逃走。我需要在他们前面多放一个\ 例如,我需要将\u0027Hello,world\u0027更改为\\u0027Hello,world\\u0027 什么样的SQL可以对表中的所有记录执行这种更新?一个带有SET yourcolumn=REPLACE(yourcolumn'\u0027','\\u0027')的update语句应该这样做。在进行大规模更新之前,
\u0027
和\u0022
。事实证明,我更需要他们逃走。我需要在他们前面多放一个\
例如,我需要将\u0027Hello,world\u0027
更改为\\u0027Hello,world\\u0027
什么样的SQL可以对表中的所有记录执行这种更新?一个带有
SET yourcolumn=REPLACE(yourcolumn'\u0027','\\u0027')的update语句应该这样做。在进行大规模更新之前,请首先尝试下面的方法以检查它是否有效
SELECT REPLACE('\u0027', '\u0027', '\\u0027')
如果您确实需要此功能,则可以使用以下RE:
UPDATE table SET c = regexp_replace(c, '[^\\]\\(u\d{4})', '\\\\\1', 'g');
确保启用了符合标准的字符串,并且将regex\u flavor设置为advanced
SHOW standard_conforming_strings;
standard_conforming_strings
-----------------------------
on
(1 row)
替换字符串“\\\\\\\\\\\
意味着后面的两个反斜杠\
和\1
表示第一个(报告)括号内的子表达式(即,'u'
与模式中的四位数字连接)。FWIW我正在使用postgresql。如果您还可以告诉我如何强制所有插入和更新之后执行相同的修改,而不以三个斜杠结束,那么您就可以获得额外的积分。您最好使用Unicode将值存储在数据库中,并在需要时执行转义操作-这将在一天结束时变得不那么复杂。这听起来让我非常怀疑。为什么“需要”在数据库中有编码数据?这通常意味着将数据放入或取出的代码存在一些严重问题。数据通常应该以原始的未扫描文本格式保存。@我可以处理数据库,但不能处理任何检索和处理数据的软件。我知道它有严重的问题,但遗憾的是我没有能力去解决这些问题。+ 1看起来很有用,但是它似乎无法检测是否已经执行了双逃逸……这就是问题所在,丹-请花一点时间认真考虑把数据存储在一个更合适的格式中。谢谢。我对此做了两个变体:一个用于处理以unicode转义序列开头的字符串,另一个将保留\u前面的字符(您提供的版本使用它)。我还不得不将反斜杠的数量增加一倍,因为我们的db不使用符合标准的字符串。讨厌的东西,但它奏效了。@Dan:你也可以用美元报价$$pattern$$来避免双重反斜杠