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

时间:2011-10-20 13:46:50

标签: 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;

提前致谢, 亚当

4 个答案:

答案 0 :(得分:127)

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

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

答案 1 :(得分:31)

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

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

更新......虽然我只是遇到了前面提到的字符&#34;在野外&#34;,但要遵循lmichelbacher的建议来翻译更多unicode newline-like字符,请使用:

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

答案 2 :(得分:18)

OP asked specifically about regexes since it would appear there's concern for a number of other characters as well as newlines, but for those just wanting strip out newlines, you don't even need to go to a regex. You can simply do:

            var initialList = new List<KeyValuePair<int, int>>();
            var listOfDistinctItems = new List<KeyValuePair<int, int>>();
            //populate initial list ...

            foreach(var item in initialList)
            {
                if (listOfDistinctItems.Exists(di => di.Key == item.Key && di.Value == item.Value))
                    continue;

                listOfDistinctItems.Add(item);
            }

I think this is an SQL-standard behavior, so it should extend back to all but perhaps the very earliest versions of Postgres. The above tested fine for me in 9.4 and 9.2

答案 3 :(得分:7)

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

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

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

希望对某人有所帮助。