2017-05-03 12 views
1

残念ながら\b正規表現文字はOracleでは機能しません。回避策として b Oracle 11gの正規表現文字

は、私は次の式を見つけた:

(^|\s|\W)(100100|100101|100102|100103)($|\s|\W) 

(参照:The missing \b regular expression special character in Oracle.を)が、テスト用文字列データに:私は一方で

Test string 100100/100101, ABC-DEF, 100102 100103 test data abc100100 100100abc. 

100101100103は、一致していません\bの場合のように一致させることを期待しています。

これを動作させる方法はありますか?私はOracle 11gを使用しています。

私はどんな助けでも高く評価されます。

EDIT:

私の目標は、すべての一致をタグ付けすることです。私は期待していた出力は次のようになります。

regexp_replace(p_text,'(^|\s|\W)(' || l_ids || ')($|\s|\W)', '\1[ddd]\2[/ddd]\3'); 

  • l_ids - |で区切られたidのリスト、ID缶

    Test string [ddd]100100[/ddd]/[ddd]100101[/ddd], ABC-DEF, [ddd]100102[/ddd] [ddd]100103[/ddd] test data abc100100 100100abc. 
    

    この目的で、私は次のステートメントを使用しています数字、文字、下線、ダッシュを含む

  • p_text - 入力テキスト

EDIT 2:上記試験文字列値100100

ワードabc100100ならびに100100abcに一致させるべきではありません。

+0

異なる行で一致を出力しますか? –

+0

'(^ | \ s | \ W)'は '($ | \ s | \ W)'でなければなりません。さらに '\ s'は' \ W'にすでに含まれています。最初の数字に続く '/'は最初のパターンで消費され、2番目のマッチでは使用できないことに注意してください。先読みなしで回避するのは難しいです。 –

+0

@vkp質問に私の編集を見てください。 – kpater87

答えて

0

と仮定 -

  • chr(1)

with t (p_text) as (select 'Test string 100100/100101, ABC-DEF, 100102 100103 test data abc100100 100100abc.' from dual) 

select replace 
     (
      regexp_replace 
      (
       regexp_replace 
       (
        p_text 
        ,'([a-zA-Z0-9]+)' 
        ,chr(1) || '\1' || chr(1) 
       ) 
       ,chr(1) || '(100100|100101|100102|100103)' || chr(1) 
       ,'[ddd]\1[/ddd]' 
      ) 
      ,chr(1) 
     ) 

from t 
[a-zA-Z0-9]にない任意の文字を区切り文字(例えば /)と考えられているテキスト
  • には表示されません。

    T [ddd] 100100 [/ ddd] 100100 [/ ddd] 100100 [/ ddd]、ABC-DEF、 [ddd] 100102 [/ ddd]テストデータabc100100 100100abc。

  • +0

    はい、それは動作します!しかし、ここに一つの問題があります。長い入力文字列では機能しません。私のテストは、最初の 'REGEXP_REPLACE'が出力を4000バイトにカットすることを示しています(これは私が理解しています)。しかし、2番目の 'REGEXP_REPLACE'は出力を約1800バイトにカットします。これは私が理解できないsthです。しかし、PL/SQLを使用してこの問題を回避することができます。ありがとうございました。 – kpater87