REGEXP_SUBSTR圆括号
我想用PL/SQL将一个分号分隔的字符串分成几个部分。只要字符串中没有圆括号,就可以使用REGEXP_SUBSTR 例如:REGEXP_SUBSTR圆括号,regex,oracle,plsql,regexp-substr,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; 预期的结果是:A B C A的结果;B(1);C应该是B(1)C,但我得到的是:A B1 selec
select REGEXP_SUBSTR('A;B;C','[^(";")]+',1,1),
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,2),
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,3)
from dual;
预期的结果是:A B C
A的结果;B(1);C应该是B(1)C,但我得到的是:A B1
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;
这意味着“(”被检测为分隔符,但我不理解这种行为。有人能告诉我吗?[]
是一个括号表达式,用于指定匹配列表,该列表应匹配列表中表示的任何一个表达式。非匹配列表表达式以扬抑(^)开头并指定与列表中表示的表达式以外的任何字符匹配的列表。“
比如说
select REGEXP_SUBSTR('"A";"B(1)";"C"','[^";"]+',1,1)
from dual;
将返回ab(1)C
,其中[^”]+
将“
或;
视为分隔符
类似地,在您的示例中,[^(“;”)+
将“
或;
或(
或)
视为与您期望相反的分隔符
因此,对于预期的输出,您可以尝试
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;
我再次爬上我的soapbox,警告人们使用
'[^;]格式的正则表达式的危险性+“
解析分隔字符串。请悔改并保存!它不会处理空元素,并将返回意外结果。有关详细信息和证据,请参阅。请改用此格式,并确保您的输出准确无误:
注意第二个元素是(空)
仔细看,空值是最后一个。想象一下所有不正确的报告。不要让其中一个成为你的报告!非常感谢,我知道了。@user1838910如果你愿意,你可以接受这个解决方案并关闭这个问题。我知道这一点。在使用regexp|u substr之前,用“|”替换“|”,这是我的工作。不过,谢谢你的帮助提示。不确定你在说什么,但realspirituals值得投票,因为他的答案对你的问题是正确的。我的答案是需要注意的附加信息。无论你做什么,确保你用你能想到的所有可能的意外数据组合进行测试,并确保你的解决方案能够处理所有这些数据!
SQL> with tbl(str) as (
select 'A;;B(1);C' from dual
)
select regexp_substr(str, '(.*?)(;|$)', 1, level, NULL, 1)
from tbl
connect by level <= regexp_count(str, ';') + 1;
REGEXP_SU
---------
A
B(1)
C
SQL>
SQL> with tbl(str) as (
2 select 'A;;B(1);C' from dual
3 )
4 select regexp_substr(str, '[^;]+', 1, level)
5 from tbl
6 connect by level <= regexp_count(str, ';') + 1;
REGEXP_SU
---------
A
B(1)
C
SQL>