0

ご存じのとおり、正規表現の Oracle POSIX 実装は単語境界をサポートしていません。ここで 1 つの回避策が提案されています: Oracle REGEXP_LIKE と単語境界

ただし、4 つの文字列をすべて選択するなど、必要に応じて機能しません。たとえば、次のように考えてください。

myvar:=regexp_substr('test test','(^|\s|\W)[\S]{4}($|\s|\W)') 

これは明らかに最初のオカレンスのみを選択します。オラクルの世界でこれを行う方法はわかりませんが、通常は単純(\b)[\S]{4}(\b)です。問題は、ほとんどの回避策が、ルックアラウンドなどの存在しない機能に依存していることです。

4

2 に答える 2

0
select xmlcast(xmlquery('for $token in ora:tokenize(concat(" ",$in)," ")
                where string-length($token) = $size
                return $token' passing 'test test' as "in", 4 as "size" returning content) as varchar2(2000)) word from dual;

Xquery と FLWOR 式。

concat(" ",$in)- 入力文字列が null であるか、一致する単語が 1 つしかない場合の回避策。

ora:tokenize- 文字列を「スペース」でトークン化

string-length($token) = $sizeトークンの長さが適切かどうかを確認します。

xmlcast- xmltype を varchar2 に変換します

簡単 ?ご質問:)

于 2016-12-16T12:29:12.247 に答える
0
DECLARE
  str     VARCHAR2(200) := 'test test';
  pattern VARCHAR2(200) := '(\w+)($|\s+|\W+)';
  match   VARCHAR2(200);
BEGIN
  FOR i IN 1 .. REGEXP_COUNT( str, pattern ) LOOP
    match := REGEXP_SUBSTR( str, pattern, 1, i, NULL, 1 );
    IF LENGTH( match ) = 4 THEN
      DBMS_OUTPUT.PUT_LINE( match );
    END IF;
  END LOOP;
END;
/

または ( 11G で導入されたREGEXP_COUNTまたは の 6 番目のパラメーターを使用しない場合):REGEXP_SUBSTR

DECLARE
  str              VARCHAR2(200) := 'test test';
  pattern CONSTANT VARCHAR2(3)   := '\w+';
  match            VARCHAR2(200);
  i                NUMBER(4,0)   := 1;
BEGIN
  match := REGEXP_SUBSTR( str, pattern, 1, i );
  WHILE match IS NOT NULL LOOP
    IF LENGTH( match ) = 4 THEN
      DBMS_OUTPUT.PUT_LINE( match );
    END IF;
    i     := i + 1;
    match := REGEXP_SUBSTR( str, pattern, 1, i );
  END LOOP;
END;
/

出力:

test
test

これを SQL で使用する場合は、パイプライン関数またはコレクションを返す関数に簡単に変換できます。

于 2016-12-16T12:37:57.887 に答える