REGEXP_SUBSTR圆括号

use*_*910 1 regex oracle plsql regexp-substr

我想用分号分隔的字符串分成PL/SQL的部分.只要字符串中没有圆括号,它就可以正常使用REGEXP_SUBSTR.

例:

select REGEXP_SUBSTR('A;B;C','[^(";")]+',1,1),
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,2),
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,3)
from dual;
Run Code Online (Sandbox Code Playgroud)

预期的结果是:ABC

A; B(1); C的结果应该是AB(1)C,但我得到的是:AB 1

select REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,1),
REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,2),
REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,3)
from dual;
Run Code Online (Sandbox Code Playgroud)

这意味着'('被检测为分隔符,但我不明白这种行为.有人可以开导我吗?

Sri*_*niV 5

[]是一个多语言正则表达式语法,它表示"用于指定匹配列表的括号表达式,该匹配列表应与列表中表示的任何一个表达式匹配.非匹配列表表达式以抑扬符号(^)开头,并指定与任何字符匹配的列表,除了列表中表示的表达式."

例如

select REGEXP_SUBSTR('"A";"B(1)";"C"','[^";"]+',1,1)
from dual;
Run Code Online (Sandbox Code Playgroud)

将返回A B(1) C其中[^";"]+认为";作为分隔符

同样,在您的示例中, [^(";")]+"OR ;OR (OR )视为与您期望的分隔符.

因此,对于您的预期输出,您可以尝试

select REGEXP_SUBSTR('A;B(1);C','[^;]+',1,1),
REGEXP_SUBSTR('A;B(1);C','[^;]+',1,2),
REGEXP_SUBSTR('A;B(1);C','[^;]+',1,3)
from dual;
Run Code Online (Sandbox Code Playgroud)