Oracle regexp_like单词边界多个单词解决方法

时间:2016-12-16 09:46:00

标签: oracle regexp-like word-boundaries

如您所知,Oracle POSIX正则表达式的实现不支持字边界。这里建议一种解决方法: Oracle REGEXP_LIKE and word boundaries

但是,如果我想,它不起作用,例如选择所有4个字符串。考虑一下,例如:

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

这显然只选择第一次出现。我不知道如何在Oracle世界中这样做,尽管通常它只是(\b)[\S]{4}(\b)。问题在于,大多数情况都依赖于某些不存在的功能,例如环视等等。

2 个答案:

答案 0 :(得分: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) - 如果输入字符串为空或只有一个匹配单词,则解决方法。

ora:tokenize - 用"空格"

标记字符串

string-length($token) = $size检查令牌是否有适当的长度。

xmlcast - 将xmltype转换为varchar2

容易吗?有问题:)

答案 1 :(得分: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;
/

或(不使用{11}中引入的REGEXP_COUNTREGEXP_SUBSTR的第6个参数):

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中使用它,则可以轻松地将其转换为流水线函数或返回集合的函数。