3

PL/SQLを使用して、単語で始まる文の最初の出現を除いて文を削除するにはどうすればよいThis productですか? すべての文がピリオド ( .) で終わり、各文が大文字で始まると仮定します。例えば:

 v_desc varchar2(500);
 v_desc := 'This product is used. Product may make you wealthy. This product may appear red. This product is not new.';

私の試み:

 v_desc := regexp_replace(v_desc,'This product*{2,}','') ;
 v_desc := regexp_replace(v_desc,'This product*{2,}*','') ;

望ましい結果

v_desc := 'This product is used. Product may make you wealthy.';
4

1 に答える 1

4

これを試して:

 v_desc := regexp_replace(v_desc,'[^^](This product).*[.]', '') ;

内訳は次のとおりです。

[^^] = Not the beginning of the line
(This product).*[.] = Searching for all instances of "This product" followed by a "."

これにより、行の先頭にない「この製品...」のすべてのインスタンスが検索されます。

※コメント後に編集

次に、あなたが望むのは、前向きな後ろ姿(?<=)です。次のようになります。

 v_desc := regexp_replace(v_desc,'(?<=(This product).*)(This product).*[.]', '') ;

壊す:

(?<=(This product).*) = Positive lookbehind.  
(This product).*[.] = What is being searched for

式「この製品...」がその前にある場合にのみ、次の値を true としてトリガーします。これにより、「この製品」の最初の出現が置換される値に表示されなくなります。

先読みと後読みは、正規表現のすべての実装でサポートされているわけではないことを指摘したいと思います。PL/SQL の詳細がわからないため、これが機能することを保証できません。Regex Heroでテストすると機能します。

于 2012-10-09T19:03:13.613 に答える