0

Oracleで正規表現パターンの特殊文字をエスケープするには?

たとえば、翻訳する関数が必要です

some.string[with(special)reg-exp]characters

some\.string\[with\(special\)reg\-exp\]characters.

PHP では preg_escape() を使用します。オラクルに対応するものはありますか?

なぜ私はこれをしているのですか?

stringaが上にあるかどうかをチェックする pl/sql 関数を作成しようとしていlist,of,string,elementsます。

これが私のコードです:

CREATE OR REPLACE 
FUNCTION list_contains(needle_    IN VARCHAR2,
                       haystack_  IN VARCHAR2,
                       separator_ IN VARCHAR2 DEFAULT ',')
RETURN INTEGER
  IS
BEGIN
  IF regexp_like(haystack_, '(^|' || separator_ || ')' || needle_ || '(' || separator_ || '|$)') THEN
    RETURN 1;
  ELSE
    RETURN 0;
  END IF;
END list_contains;

関数は基本的に機能します:

list_conains('eve','john,eve,maria,steve') => 1

問題は、正規表現で特別な意味を持つ orneedle_などseparator_の奇妙な値でそれを呼び出そうとしたときです。.

list_conains('eve','john.maria.steve','.') => 1

ご覧のとおり、リストに eve はありませんが、は steve の名前の文字と.一致するため、関数は誤って を返します。t1

ドットを手動で置き換えることができることはわかっていますが、干渉する正規表現の特殊文字が他にもたくさんあるので、自分ですべての文字をリストしようとはしません。

needle_とseparator_をエスケープするには?

4

5 に答える 5

2

あなたの質問を正しく理解していれば、正規表現は必要ありません。単純な LIKE を使用できます。

IF separator_ || haystack_ || separator_ LIKE '%'||separator_||needle_||separator_||'%' THEN
   RETURN 1;
ELSE
   RETURN 0;
END IF;

編集:%または_それ自体がseparator_の場合、それらをエスケープする必要があります。

IF separator_ = '%' OR separator_ = '_'
THEN
  separator_ := '\' || separator_;
END IF;

IF separator_ || haystack_ || separator_ LIKE
     '%' || separator_ || needle_ || separator_ || '%' ESCAPE '\'
THEN
  RETURN 1;
ELSE
  RETURN 0;
END IF;
于 2013-09-20T12:10:03.727 に答える
1

次の文字はエスケープする必要があります: \ ^ . $ | ( ) [ ] * + ? { } 、

http://psoug.org/snippet/Regular-Expressions--Regexp-Cheat-Sheet_856.htm

SELECT REGEXP_REPLACE('some.string[with(special)reg-exp]characters', '([][)(}{.$*+?,|^\])', '\\\1') "REGEXP_REPLACE" FROM dual;
于 2013-12-05T17:54:53.623 に答える