如您所知,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)
。问题在于,大多数情况都依赖于某些不存在的功能,例如环视等等。
答案 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_COUNT
或REGEXP_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中使用它,则可以轻松地将其转换为流水线函数或返回集合的函数。