PostgreSQL regexp replace (), чтобы сохранить только один пробел
мне нужно очистить столбец строки с пробелами и вкладками, включенными внутри, в начале или в конце строк (это беспорядок !). Я хочу, чтобы между каждым словом был только один пробел. Скажем, у нас есть следующая строка, которая включает в себя все возможные ситуации:
mystring = ' one two three four '
- 2 пробела перед 'one'
- 1 пробел между 'один' и 'два'
- 4 пробела между " два " и "три"
- 2 вкладки после "три"
- 1 вкладка после "четыре"
вот как я делаю это :
- удалить ведущие и конечные пробельные символы
- Я удаляю ведущие и конечные вкладки
- я заменяю оба "пробелы, повторяющиеся по крайней мере два" и вкладки единственным пробелом
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