0

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

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

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

这显然只选择了第一次出现。我不知道如何在 Oracle 世界中执行此操作,尽管通常它只是(\b)[\S]{4}(\b). 问题是大多数 woraround 依赖于一些不存在的功能,如环视等。

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)- 如果输入字符串为空或只有 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;
/

或(不使用REGEXP_COUNT或在 11G 中引入的第 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 回答