37

単語の境界をREGEXP_LIKEと一致させるのに問題があります。次のクエリは、期待どおりに1つの行を返します。

select 1 from dual
where regexp_like('DOES TEST WORK HERE','TEST');

しかし、私は単語の境界でも一致させたいです。したがって、「\ b」文字を追加すると、このクエリが得られます

select 1 from dual
where regexp_like('DOES TEST WORK HERE','\bTEST\b');

これを実行すると、ゼロ行が返されます。何か案は?

4

3 に答える 3

62

やってみたいと思います

 select 1 from dual 
  where regexp_like ('does test work here', '(^|\s)test(\s|$)');

\bはこのリストに表示されないため: Oracle正規表現のPerlの影響を受ける拡張機能

\s、テストが空白で開始および終了することを確認します。testただし、文字列は、一致する文字列の最初または最後にも表示される可能性があるため、これでは不十分です。したがって、文字列の開始と文字列の終了に代替(で示される|)を使用します。^$

更新(3年以上後)... たまたま、今日この機能が必要でしたが、正規表現の方が優れているように見えます(^|\s|\W)test($|\s|\W)Oracleに\ b正規表現の特殊文字がありません)。

于 2011-09-27T10:47:04.260 に答える
7

Oracleで単語全体をチェックできる最短の正規表現は

(^|\W)test($|\W)

正規表現のデモを参照してください。

詳細

  • (^|\W)-いずれかに一致するキャプチャグループ
    • ^-文字列の開始
    • |- また
    • \W-単語以外の文字
  • test- 単語
  • ($|\W)-いずれかに一致するキャプチャグループ
    • $-文字列の終わり
    • |- また
    • \W-単語以外の文字。

\W文字、数字、およびを除くすべての文字に一致することに注意してください_。間に表示される可能性のある単語_(アンダースコア)を照合する場合は、少し異なるパターンが必要です。

(^|[^[:alnum:]])test($|[^[:alnum:]])

否定された[^[:alnum:]]角かっこ式は、英数字以外のすべての文字と一致し、、と一致_するため、_test_このパターンと一致します。

この正規表現のデモを参照してください。

于 2018-09-21T10:10:59.020 に答える
1

一般的に、私はルネの解決策に固執しますが、マッチをゼロレングスにする必要がある場合は例外です。つまり、最初/最後で単語以外の文字を実際にキャプチャする必要はありません。

たとえば、文字列が2回一致するtest test場合、最初の出現のみに一致します。少なくとも、regexp_substrを使おうとすると、確かにそうなります。(\b)test(\b)(^|\s|\W)test($|\s|\W)

SELECT regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 1, 'i'), regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 2, 'i') FROM dual;

戻り値

test |NULL

于 2015-02-11T14:10:41.573 に答える