2017-02-02 7 views
1

要件正規表現は、文字列の内容

私は2つの形式で値を含むPostgresの列を持っているに応じて、異なるグループにマッチします。社名にはカンマが含まれていますが、個人名にはカンマが含まれています

私はこのように、唯一の個人名を略記クエリを生成する必要が
_owner_titlecase 
------------------------- 
McCartney, James Paul 
Lennon, John Winston Ono 
Harrison, George 
Starkey, Richard 
The Beatles 

:いくつかのパフォーマンス・テストの後

regexp_replace 
------------------------- 
McCartney, J P 
Lennon, J W O 
Harrison, G 
Starkey, R 
The Beatles 

背景

、私は私がすることはできません実現してきましたCASEを使用して、2つの行タイプを異なる方法で扱います(CASE WHEN _owner_titlecase ~ ',' regexp_replace...のように)。だから、私は二つのタイプを別々に扱うことができる単一の正規表現を書く方法があることを望んでいる。

I個人名の頭文字の一部を処理する方法についてpreviously asked、以下のようになりました(^\w+)|\Y\w正規表現を使用しています:

, regexp_replace(_owner_titlecase 
    , '(^|;\s+)(\w+)|\Y\w' 
    , '\1', 'g') 

は今、私はもちろん、企業名、見て範囲を拡大してきましたThe BeatlesThe Bと略されています。

\Yは、私がhereについて学んだPostgresの正規表現文字クラスで、単語の始まりや終わりではない点でのみ一致します。特別なPostgresクラスはこのような状況で使用できるように見えますが、regex101.comのような場所でテストできるので、普遍的な正規表現機能を使うことは実際には便利です。現在のところ私の唯一のPostgresテストプラットフォームはやや厄介で、デバッグの助けはありません。

私たちは、プロパティ所有者名を含むレイヤーをスーパーインポーズしたいCartoDBマップを持っているという話があります。いくつかのプロパティは近くにあり、所有者名のリストは長くなる可能性があるため、省略する必要があります。

+2

私は '^([^、] *)$ |(^ |; \ s +)(\ w +)| \ Y \ w'パターンを使用し、' '\ 1 \ 2 \ 3 ' –

+0

もう一度@wictorありがとうございます。これはほとんどの個人的な名前のために働きます。それは、オブリアン、ジョン・アンドリューの権利を得ていない。 – OutstandingBill

+0

私はこの問題を正しく理解していないかもしれませんが、 'WHERE name LIKE '%、%'' – Fallenhero

答えて

1

私はあなたのポイントは、あなたが唯一の単語文字で先行され任意の単語の文字を削除し、他のすべてを維持する必要があるということです

regexp_replace(_owner_titlecase, 
    '^([^,]*)$|(^|;\s+)([\w\u0027]+)|\Y\w', 
    '\1\2\3', 'g') 

を使用すべきであることを示唆しています。したがって、削除する必要のあるパターンをの前にキャプチャした別のブランチとして追加することができます(保持する必要のあるテキスト)。

^([^,]*)$部分は、,以外の0以上の文字で構成された文字列にのみ一致し、キャプチャされます。\1の場合、置換結果に復元されます。

+0

パターンを '^([^、] *)$ |(^ |; \ s +)に少し伸ばすことで、' O'Brien、Andrew John'問題( 'O'B、AJ' )([\ w \ u0027] +)| \ Y [\ w \ u0027] '。 '|'のどちら側が責任あるか分かりません。 – OutstandingBill

+1

最後のブランチの '\ u0027'は必要ないと思います。正規表現のデモ](https://regex101.com/r/CbydIO)[^([^、] *)$ |(^ |; \ s +)([\ w \ u0027] +)/1)。それは十分であるように見えます。名前には接頭辞「O」を付けることはできません。 –