我希望下面的代码返回这两行
88518-008
89274-021(08518-008,09274-021)
但是它只返回第二个,我不明白为什么,任何帮助都很好!
WITH DATA AS
(
SELECT '88518-008,89274-021(08518-008,09274-021)' str
FROM dual
)
SELECT TRIM(REGEXP_SUBSTR(str, '[^,]+\((.+)\)|[^,]+(?![^\(]*\))+', 1, LEVEL)) str
FROM DATA
CONNECT BY REGEXP_INSTR(str, '\,(?![^\(]*\))', 1, LEVEL - 1) > 0
我已经在线测试了正则表达式,并且它们按预期工作,并且从另一个示例中提取了查询,并尝试替换满足我需要的值。
答案 0 :(得分:0)
您需要以下正则表达式:
'([^,]*),(.*\([^\)]+\))'
首先创建一个Group 1
,匹配comma
以外的任何内容,然后创建一个comma
,然后创建一个Group 2
,对所有left parenthes
进行数学运算,然后是left parenthes
,然后是right parenthes
之前的所有内容,最后是right parenthes
。
这将为您提供Group 1
中的第一个值,以及Group 2
中的第二个值。
答案 1 :(得分:0)
感谢您的帮助,以下内容返回了预期的结果
WITH DATA AS
(
SELECT 'word1, word2, word3, word4, word5, word6 (word7, word8)' str FROM dual
)
SELECT trim(regexp_substr(str, '[^,]+\((.+)\)|[^,]+(?![^\(]*\))+|[^,]+', 1, LEVEL)) str
FROM DATA
CONNECT BY REGEXP_INSTR(str, ',', 1, LEVEL) > 0