我试图采用一个定界的字符串并返回定界符之间的每个子字符串。这在我正在编写的更大的函数中使用,因此分隔符通常是变量。
我们使用的一个非常常见的定界符是',',因此这是我的第一个测试用例。我有不同的问题,具体取决于我如何在正则表达式中格式化定界符。
以下是我尝试过的不同操作和结果:
select REGEXP_SUBSTR ('foo bar', '[^' || '(, )' || ']+', 1, LEVEL) item
from dual
connect by REGEXP_SUBSTR ('foo bar', '[^' || '(, )' || ']+', 1, LEVEL
select REGEXP_SUBSTR ('foo bar', '[^' || '(,\s)' || ']+', 1, LEVEL) item
from dual
connect by REGEXP_SUBSTR ('foo bar', '[^' || '(,\s)' || ']+', 1, LEVEL
select REGEXP_SUBSTR ('foo bar', '[^' || '(,[:blank:])' || ']+', 1, LEVEL) item
from dual
connect by REGEXP_SUBSTR ('foo bar', '[^' || '(,[:blank:])' || ']+', 1, LEVEL
即使没有逗号,第一次和第三次尝试也会在空格上分隔“ foo”和“ bar”。后一种尝试按希望的方式将'foo'和'bar'保持在同一行,但是如果字符串中包含s(例如horse),则结果为'hor''e'。
我对正则表达式和regexp_substr的理解告诉我
'[^(,\s)]+'
遇到逗号时,应将字符串分隔开,然后使用空格。但是显然这没有发生。我尚未找到与我有类似问题的任何人。任何帮助将非常感激
供参考,我在SQL Developer中使用Oracle Database 11g企业版11.2.0.4.0版-64位生产
您对匹配字符列表的工作方式感到困惑。从文档中:
[字符...]匹配字符列表
匹配括号内列表中的任何单个字符。在列表中,除这些以外的所有>运算符均视为文字:
范围运算符:
-POSIX字符类:[::]
POSIX归类元素:[。。]
POSIX字符等效类:[= =]
因此,在您的模式中'[^(,\s)]+'
,这些字符中的每个字符都被视为文字。在\
不使s
被视为空白字符,它只是一个s
,因此被匹配horse
。而且括号也是文字,因此它们没有将定界符中的字符对括起来,每个字符只匹配字符串中的实际括号。在您的第一次和第三次尝试中,由于匹配列表中的每个字符都是独立的,因此您仅在一个空格上进行了匹配,因此括号中的每个字符都不像您期望的那样组合在一起。
据我所知,您不能否定一对值(尽管正则表达式不是强项,所以我很可能对此大错特错)。一种选择是将分隔符的所有外观替换为您不知道的字符-根据您的实际数据,您可能不得不选择一个无法打印的字符或一个晦涩的Unicode字符-然后在正则表达式中使用该字符。
例如,为了简洁起见,使用绑定变量和哈希作为我知道的字符不存在:
variable string varchar2(20);
variable delimiter varchar2(2);
exec :string := 'foo bar, the cad, left';
exec :delimiter := ', ';
select regexp_substr(replace(:string, :delimiter, '#'),
'[^#]+', 1, level) as item
from dual
connect by regexp_substr(replace(:string, :delimiter, '#'),
'[^#]+', 1, level) is not null;
ITEM
--------------------
foo bar
the cad
left
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句