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

aeu*_*ere 62 regex postgresql

所有,

我再次陷入困境,试图以我需要的格式获取数据.我有一个看起来像这样的文本字段.

"deangelo 001 deangelo

当地名称来源:italain

来自美国名称deangelo

意思是:天使

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

个人诚信•他的好名声是他最宝贵的财富.个性•当你被火鸡包围时,很难翱翔老鹰!关系•开始缓慢,但与deangelo的关系随着时间的推移而建立.旅行和休闲•一生中的旅行是他的未来.

事业和金钱•一个有天赋的孩子,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;
Run Code Online (Sandbox Code Playgroud)

亚当,先谢谢你

val*_*gog 140

select regexp_replace(field, E'[\\n\\r]+', ' ', 'g' )
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你删除了'E`前缀,你可以摆脱双斜线:''[\n\r] +'`.看起来更清洁,imo. (23认同)
  • @Jens与其他正则表达式引擎一样,''g'这里允许完全替换.如果没有它,替换只会在每个"线"发生一次,在这种情况下,这只是意味着"只有一次",因为Postgres并不认为`\n'作为换行符. (4认同)

pbn*_*son 31

select regexp_replace(field, E'[\\n\\r\\u2028]+', ' ', 'g' )
Run Code Online (Sandbox Code Playgroud)

我在postgres d/b中遇到了同样的问题,但问题的换行符不是传统的ascii CRLF,它是一个unicode行分隔符,字符U2028.上面的代码片段也会捕获该unicode变体.

更新......虽然我只是遇到过"野外"的上述角色,但要按照lmichelbacher的建议翻译更多类似unicode换行符的字符,请使用:

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


Sel*_*edy 20

OP专门询问有关正则表达式的问题,因为它会出现一些其他字符和换行符的问题,但对于那些只想删除换行符的人来说,你甚至不需要去正则表达式.你可以简单地做:

select replace(field,E'\n','');
Run Code Online (Sandbox Code Playgroud)

我认为这是一个SQL标准的行为,因此它应该延伸回所有但可能是最早的Postgres版本.上面在9.4和9.2中对我进行了测试

  • 我想提醒大家,`replace` 替换第二个参数的精确匹配,而不是它的每个字符。 (2认同)

小智 7

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

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

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

希望它对某人有帮助.