PostgreSQL regexp_replace()只保留一个空格

wil*_*map 17 regex string postgresql whitespace replace

我需要清理一个字符串列,其中包含空格和制表符,在字符串的开头或结尾处(这是一团糟!).我想在每个单词之间只留一个空格.假设我们有以下字符串,其中包含所有可能的情况:

mystring = '  one two    three      four    '
Run Code Online (Sandbox Code Playgroud)
  • 'one'之前的2个空格
  • 'one'和'two'之间有1个空格
  • "两个"和"三个"之间有4个空格
  • '三'后2个标签
  • '四'后的1个标签

这是我的方式:

  1. 我删除了前导和尾随空格
  2. 我删除了前导和尾随标签
  3. 我将'重复至少两个的空格'和标签替换为唯一的空格

WITH

  t1 AS (SELECT'  one two    three      four    '::TEXT AS mystring),

  t2 AS (SELECT TRIM(both ' ' from mystring) AS mystring FROM t1),

  t3 AS (SELECT TRIM(both '\t' from mystring) AS mystring FROM t2)

  SELECT regexp_replace(mystring, '(( ){2,}|\t+)', ' ', 'g') FROM t3 ;
Run Code Online (Sandbox Code Playgroud)

我最终得到以下字符串,看起来不错,但我仍然有一个尾随空格...

'one two three four '
Run Code Online (Sandbox Code Playgroud)

有没有想过以更简单的方式做到这一点并解决最后一个问题?

非常感谢 !

小智 35

SELECT trim(regexp_replace(col_name, '\s+', ' ', 'g')) as col_name FROM table_name;
Run Code Online (Sandbox Code Playgroud)

或者在更新的情况下:

UPDATE table_name SET col_name = trim(regexp_replace(col_name, '\s+', ' ', 'g'));
Run Code Online (Sandbox Code Playgroud)

  • 在Postgres 9.5中使用`\ s`而不是`\\ s`. (4认同)
  • 在Postgres 9.4和10.0上,似乎应该使用`\ s`而不是`\\ s`. (2认同)