2017-04-05 9 views
0

私はOracle 11.gを使用しています。私は電子メールアドレスからeMailサービスプロバイダだけを見つけることができるように仮想カラムを作成したい。たとえば、 "[email protected]"を含むeMailAddress列に基づいて新しい列に "verizon.net"を表示したいのですが、eMailAddressの "@"の後ろのすべてを見つけるために正規表現が必要ですカラム。私は11gが先読みをサポートしているとは思わない。これに対して正規表現をどのように構築するのですか? これを見ていただきありがとうございます。電子メールサービスプロバイダの正規表現

Select regexp_substr(email_address, '@([[:alnum:]]+\.?){1,2}/?') 
From mail_recipient 
Where prim_key = 1; 

仮想列を生成するために、実際のコードは以下の通りです:

Alter Table mail_recipient 
    Add (EMAIL_PROVIDER VARCHAR2(4000 BYTE) 
    Generated Always As 
    (regexp_substr(email_address, '@([[:alnum:]]+\.?){1,2}/?')) VIRTUAL); 
+0

上記のコードは、期待どおりの結果が得られているようだ、任意の数のを許すが、私は過度に複雑な正規表現を構築してきたかはわかりません。 – user3138025

+0

名前に " - "と "_"を許可しませんか?一方、なぜオプションの "/"を最後に付けるのはなぜですか?私は "ver-iz_on.com"はあなたの正規表現と一致しませんが、すべきだと思います。また、 "verizon"( "。"の欠落に注意)には、いくつかのマッチオプション(時間の無駄遣い)があります。より効率的なのは '@([[:alnum:] _-] +(\。[[alnum:] _-] +){0,1})'です。これには "verizon"と "verizon.com"(あなたのようなもの)に一致する方法が1つしかありません。どうすれば "@ post.another.com"(2つの点に注意してください)と一致するはずですか?少なくとも「.com」は含まないと思う。単語終わりのアンカー(「\ b」など)を追加しますか? – Yunnosch

+0

私はテスト済みの回答を作成することができます。より多くのサンプル入力と望ましい出力を提供することができます。たとえば、一致していて一致しない名前のより多様な例があります。 perlの正規表現のフレーバがOKかどうか、私はあなたの環境に慣れていないかどうかを教えてください。 Sed、grep、egrepも利用可能です。 – Yunnosch

答えて

1

だからいくつかのフィードバックの繰り返しの後に、これはOPの問題を解決するものである:「

'@([[:alnum:]_-]+(\.[[:alnum:]_-]+){0,})' 
  • 試合よりしっかりと広範囲のバックトラッキングを減らす
  • "[_ - ]"
  • は、さらに「.blabla」
関連する問題