2017-01-31 7 views
1

"Smith、John Albert"のような名前のPostgresテーブルがあり、 "Smith、J A"のような名前のビューを作成する必要があります。 Postgresはいくつか持っていますregex implementations私は他の場所で見たことがありません。名前を姓とイニシャルに分割する方法

は、これまでのところ私は、だから私は、私は元の文字列に置き換え開始途中を作る方法を見つける必要があり思ってい

S, J A 

返し

SELECT regexp_replace('Smith, John Albert', '\Y\w', '', 'g'); 

を持っています。 @bubとして

+1

カンマの後に2番目の部分だけ正規表現を実行してください。 –

+1

'(^ \ w +)| \ Y \ w'を試してみて、' \ 1'に置き換えてください。 –

+0

これは機能しますか? –

答えて

2

regex used in PostgreSQLが実際にヘンリー・スペンサーによって書かれたソフトウェアパッケージを使用して実装されています。それは奇妙ではない、それはそれ自身の利点、特異性を持っています。

通常のNFA正規表現エンジンとの違いの1つは、単語境界です。ここでは、\Yは単語以外の境界に一致します。あなたが必要とする残りのパターンは、かなり知られているものです。

したがって、'^(\w+)|\Y\w'パターンと'\1'の置換えを使用する必要があります。

詳細

  • ^ - 文字列アンカーの開始
  • (\w+)からCapturing group 1つのマッチング1+単語文字(これは、置換パターンから\1と呼ぶ)
  • | - または
  • \Y\w - 別の単語文字の前に置かれた単語char。

\1だけで、交換用の結果に、グループ1でキャプチャされた値を置くこと、replacement numbered backreferenceと呼ばれています。

+0

私は、ノーマルとは違って「奇妙」を意味しましたが、ポイントは取られました、それはまた劣等感を意味します。質問が編集されました。 – OutstandingBill

1

が示唆:

t=# SELECT concat(split_part('Smith, John Albert',',',1),',',regexp_replace(split_part('Smith, John Albert',',',2), '\Y\w', '', 'g')); 
    concat 
------------ 
Smith, J A 
(1 row) 
+0

はうまく動作し、最初は入っていましたが、@WiktorStribiżewのソリューションよりもエレガントではないので、Laurenz Albeのソリューションを受け入れます。ありがとうございます – OutstandingBill

+0

@OutstandingBill確かな事 –

2

オリジナルのアイデアは、Wiktor第Stribiżewである:

SELECT regexp_replace('Smith, John Albert', '^(\w+)|\Y\w', '\1', 'g'); 

regexp_replace 
---------------- 
Smith, J A 
(1 row) 
+1

そしてそれは私の正規表現です。第2のグループは、置換パターンから参照されないので意味をなさない。 –

+0

あなたは大丈夫です。 –

関連する問題