Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
REGEXP_SUBSTR圆括号_Regex_Oracle_Plsql_Regexp Substr - Fatal编程技术网

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

我想用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

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>