PostgreSQL regexp replace (), чтобы сохранить только один пробел

мне нужно очистить столбец строки с пробелами и вкладками, включенными внутри, в начале или в конце строк (это беспорядок !). Я хочу, чтобы между каждым словом был только один пробел. Скажем, у нас есть следующая строка, которая включает в себя все возможные ситуации:

mystring = '  one two    three      four    '
  • 2 пробела перед 'one'
  • 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 ;

В конце концов я получаю следующую строку, которая выглядит хорошо, но у меня все еще есть трейлинг пробел...

'one two three four '

любая идея о том, чтобы сделать это более простым способом и решить эту последнюю проблему ?

большое спасибо !

3 ответов


SELECT trim(regexp_replace(col_name, '\s+', ' ', 'g')) as col_name FROM table_name;

или в случае обновления :

UPDATE table_name SET col_name = trim(regexp_replace(col_name, '\s+', ' ', 'g'));

SELECT trim(regexp_replace(mystring, '\s+', ' ', 'g')) as mystring FROM t1;

публикация ответа в случае, если люди не смотрят на комментарии.

использовать '\s+'

не '\s+'

работал для меня.


это не сработало для меня с trim и regexp_replace. Поэтому я пришел с другим решением:

SELECT trim(
    array_to_string(
        regexp_split_to_array('  test    with many  spaces  for        this   test  ', E'\s+')
    , ' ')
) as mystring;

первый regexp_split_to_array устраняет все пробелы, оставляя "пробелы" в начале и конце.

-- regexp_split_to_array output:
-- {"",test,with,many,spaces,for,this,test,""}

, когда using array_to_string все', ' становятся пробелами

-- regexp_split_to_array output ( '_' instead of spaces for viewing ):
-- _test_with_many_spaces_for_this_test_

отделка для удаления головы и хвоста

-- trim output ( '_' instead of spaces for viewing ):
-- test_with_many_spaces_for_this_test