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

101
我又遇到了困难,需要把我的数据转换成所需的格式。 我有一个文本字段,看起来像这样。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;
4个回答

222

38
如果去掉E前缀,你可以消除双斜杠:'[\n\r]+'。在我看来,这样看起来更加简洁。 - jpmc26
链接的文档包含以下文本:“flags”参数是一个可选的文本字符串,其中包含零个或多个单字母标志,可以改变函数的行为。标志i指定大小写不敏感匹配,而标志g指定替换每个匹配的子字符串,而不仅仅是第一个。支持的标志(虽然不包括g)在表9-20中描述。 - valgog
5
和其他正则表达式引擎一样,'g' 选项允许进行全局替换。如果没有此选项,则每行只会替换一次,在本例中几乎相当于 "只能替换一次",因为 PostgreSQL 不会把 \n 视作断行。 - Seldom 'Where's Monica' Needy
UPDATE MYTABLENAME AS u SET name = regexp_replace(u.name, E'[\n\r]+', ' ', 'g') ; 这将更改整个表的名称字段。 - FlyingV

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

我在我的Postgres数据库中遇到了同样的问题,但所涉及的换行符不是传统的ASCII CRLF,而是Unicode行分隔符,字符U2028。上面的代码片段还将捕获该Unicode变体。
更新...尽管我只在现实生活中遇到了上述字符,但为了遵循lmichelbacher的建议,即使是更多的unicode newline-like字符也要使用此代码:
select regexp_replace(field, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g' )

1
你可能想在正则表达式中添加其他“换行符”Unicode字符:http://en.wikipedia.org/wiki/Newline#Unicode - malana
谢谢,对我很有帮助。 - Ciro

43

OP 特别询问了正则表达式,因为似乎还涉及到其他字符以及换行符的问题,但对于那些只想要去除换行符的人,甚至不需要使用正则表达式。你可以简单地执行:

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

我认为这是符合SQL标准的行为,所以它应该适用于除了最早期的Postgres版本以外的所有版本。测试结果表明,在9.4和9.2版本中都可以正常工作。


2
我想提醒大家,replace只替换第二个参数的完全匹配,而不是其中的每个字符。 - expert
避免使用正则表达式可以获得额外的分数! - deroby

17

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

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

请记住,符号^表示字符串的开头,符号$表示字符串的结尾。

希望能对某些人有所帮助。


非常感谢您在字符串末尾添加 $ 提示,这正是我正在寻找的。 - leole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接