如何在Postgresql中删除回车符和换行符?


70

所有,

我再次陷入尝试以我需要的格式获取数据的问题。我有一个像这样的文本字段。

“ deangelo 001 deangelo

名称的本地来历:italain

来自美国名字deangelo

含义:天使之

情感谱•他是所有人欢乐的源泉。

个人品格•他的好名声是他最宝贵的财富。个性•被火鸡包围时,老鹰很难飞翔!关系•起步很慢,但与deangelo的关系会随着时间而建立。旅行与休闲•他的未来将是一生的旅程。

事业和金钱•天才的孩子,迪安吉洛将需要不断受到挑战。

人生的机会•快乐和幸福等待着这个有福的人。

迪安吉洛的幸运数字:12•38•18•34•29•16

在Postgresql中删除回车符和换行的最佳方法是什么?我已经尝试了几件事,但没有一件事情想要表现。

select regexp_replace(field, E'\r\c', '  ', 'g') from mytable
    WHERE id = 5520805582

SELECT regexp_replace(field, E'[^\(\)\&\/,;\*\:.\>\<[:space:]a-zA-Z0-9-]', ' ')
    FROM mytable
    WHERE field~ E'[^\(\)\&\/,;\*\:.\<\>[:space:]a-zA-Z0-9-]'
    AND id = 5520805582;

在此先感谢亚当

Answers:


168
select regexp_replace(field, E'[\\n\\r]+', ' ', 'g' )

阅读手册http://www.postgresql.org/docs/current/static/functions-matching.html


25
如果删除E前缀,则可以消除双斜杠'[\n\r]+'。看起来更干净,imo。
jpmc26 2015年

链接的文档包含以下文本:```flags参数是一个可选的文本字符串,其中包含零个或多个更改功能行为的单字母标志。标志i指定不区分大小写的匹配,而标志g指定替换每个匹配的子字符串,而不是仅替换第一个。表9-20中描述了受支持的标志(尽管不是g)。```
-valgog

4
@Jens与其他正则表达式引擎一样,'g'此处允许完全替换。如果没有它,替换将仅在每个“行”中发生一次,在这种情况下,考虑到Postgres不将\ns视为换行符,这在很大程度上仅意味着“仅一次” 。
很少'哪里有莫妮卡'Needy'2013年

35
select regexp_replace(field, E'[\\n\\r\\u2028]+', ' ', 'g' )

我在postgres d / b中遇到了同样的问题,但是所讨论的换行符不是传统的ascii CRLF,而是Unicode行分隔符,字符U2028。上面的代码片段也将捕获该unicode变体。

更新...尽管我只在野外遇到过上述字符,但要遵循lmichelbacher的建议来翻译更多的Unicode换行符,请使用以下命令:

select regexp_replace(field, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g' )

1
您可能想向该正则表达式添加其他“ newline-y” Unicode字符:en.wikipedia.org/wiki/Newline#Unicode
malana 2015年

22

OP专门询问了正则表达式,因为它似乎还涉及其他许多字符以及换行符,但是对于那些只想删除换行符的人,您甚至不需要使用正则表达式。您可以简单地执行以下操作:

select replace(field,E'\n','');

我认为这是一种SQL标准的行为,因此它应该扩展到除Postgres最早版本以外的所有版本。上面的测试在9.4和9.2中对我来说很好


1
我想提醒大家,它replace取代了第二个参数的精确匹配,而不是它的每个字符。
专家

11

如果您需要从字符串的开头或结尾删除换行符,则可以使用以下命令:

UPDATE table 
SET field = regexp_replace(field, E'(^[\\n\\r]+)|([\\n\\r]+$)', '', 'g' );

请记住,帽子^表示字符串的开头,而美元符号$表示字符串的结尾。

希望它能帮助某人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.