web-dev-qa-db-ja.com

PostgreSQLのregexp_replace()で空白を1つだけ保持

文字列の最初または最後に空白とタブの両方が含まれている文字列列をクリーンアップする必要があります(これは混乱です!)。各Wordの間に空白を1つだけ保持したい。考えられるすべての状況を含む次の文字列があるとします。

mystring = '  one two    three      four    '
  • 「1」の前に2つの空白
  • 「one」と「two」の間に1つの空白
  • 「2」と「3」の間の4つの空白
  • 「3」の後に2つのタブ
  • 「4」の後に1つのタブ

ここに私がそれをする方法があります:

  1. 先頭と末尾の空白を削除します
  2. 先頭と末尾のタブを削除します
  3. 「2つ以上繰り返される空白」とタブの両方を単一の空白に置き換える
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 '

より簡単な方法でそれを行い、この最後の問題を解決することについてのアイデアはありますか?

どうもありがとう !

18
wiltomap
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'));
38
augustorf

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

コメントを見ない人のために回答を投稿する。

'\s+'を使用

'\\s+'ではない

私のために働いた。

1
openwonk

trimregexp_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
0
Dan