PostgreSQL 中的正则表达式替换
Posted
技术标签:
【中文标题】PostgreSQL 中的正则表达式替换【英文标题】:Regex replacement in PostgreSQL 【发布时间】:2011-09-07 10:49:44 【问题描述】:我有一个表格,其中一个特定的字符串字段通常在其中包含单引号和双引号的 unicode:分别为 \u0027
和 \u0022
。事实证明,我实际上更需要他们逃脱。我需要在他们前面多加一个\
。
比如我需要把\u0027Hello, world\u0027
改成\\u0027Hello, world\\u0027
什么样的 SQL 可以对表中的所有记录执行这种更新?
【问题讨论】:
FWIW 我正在使用 postgresql。如果您还可以向我展示如何强制所有插入和更新在之后执行相同的修改,而不会以三个斜杠结束。 您最好以 Unicode 格式将值存储在数据库中,并在需要时执行转义 - 最终它会变得不那么复杂。 这听起来对我来说真的很可疑。为什么你“需要”在数据库中有编码数据?这通常意味着将数据放入或取出数据的代码存在一些严重问题。数据通常应以未转义的原始文本格式保存。 @将允许我使用数据库,但不能使用任何检索和处理数据的软件。我知道它存在严重问题,但遗憾的是,我无法解决这些问题。 【参考方案1】:如果你真的需要这个,那么你可以使用这样的RE:
UPDATE table SET c = regexp_replace(c, '[^\\]\\(u\d4)', '\\\\\1', 'g');
确保 standard_conforming_strings 已启用并且 regex_flavor 设置为高级。
SHOW standard_conforming_strings;
standard_conforming_strings
-----------------------------
on
(1 row)
替换字符串'\\\\\1'
表示后面的两个反斜杠\\
和\1
表示第一个(报告)括号子表达式(即'u'
与模式中的四位数字连接)。
【讨论】:
谢谢。我对此做了两种变体:一种用于处理以 unicode 转义序列开头的字符串,另一种用于保留 \u 之前的字符(您提供的版本会使用它)。由于我们的数据库不使用standard_conforming_strings,我还不得不将反斜杠的数量加倍。恶心的东西,但它奏效了。 @Dan:您还可以使用美元引用 $$pattern$$ 来避免双反斜杠 postgresql.org/docs/9.0/static/…【参考方案2】:一个带有SET yourcolumn = REPLACE(yourcolumn, '\u0027', '\\u0027')
的UPDATE 语句应该可以做到这一点。在进行大规模更新之前先尝试以下方法以检查它是否有效。
SELECT REPLACE('\u0027', '\u0027', '\\u0027')
【讨论】:
+1 这看起来确实有用,但它似乎无法检测到是否已经执行了双重转义。 ...问题就在于此,Dan - 请花点时间认真考虑以更合适的格式存储数据。以上是关于PostgreSQL 中的正则表达式替换的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式从 postgresql 中的时间戳字符串中间删除“-”
正则表达式/Python:当正则表达式已经进行替换时,Python 中的替换