Oracle SQL拆分字符串时保留分隔符的实现方法
Oracle SQL 实现保留分隔符的字符串拆分
你之前使用的正则[^+]+仅匹配非分隔符的连续内容,会自动过滤掉分隔符本身,无法满足操作数、分隔符逐行单独输出的要求。正确实现的核心是调整正则匹配规则,将「连续非分隔符的操作数」和「单个分隔符」都作为独立匹配单元,结合层级查询即可得到预期结果。
可直接运行的实现代码
适配你给出的测试场景(Oracle环境,基于connect by层级查询):
SELECT TRIM(regexp_substr('D*(A+B)-(C+A)*(C+A)', '([^+\-/*)(]+|[+\-/*)(])', 1, level)) AS split_result FROM dual CONNECT BY regexp_substr('D*(A+B)-(C+A)*(C+A)', '([^+\-/*)(]+|[+\-/*)(])', 1, level) IS NOT NULL;
正则逻辑说明
匹配规则([^+\-/*)(]+|[+\-/*)(])通过或逻辑|覆盖两类需要输出的内容:
[^+\-/*)(]+:匹配连续的、不在分隔符集合+-/*)(内的字符,即所有操作数内容[+\-/*)(]:匹配任意单个属于分隔符集合的字符,即所有需要单独成行的运算符、括号- 外层嵌套
TRIM函数用于过滤输入首尾可能存在的空白字符、换行符导致的空匹配行
运行结果
执行上述SQL后输出和预期完全一致:
split_result ------------ D * ( A + B ) - ( C + A ) * ( C + A )
调整说明
如果后续需要修改分隔符集合,只需要同步更新正则两个方括号内的分隔符列表即可。注意-在正则方括号内有表示字符范围的特殊含义,需要添加转义符\,避免正则解析出错。
内容的提问来源于stack exchange,提问作者Killer Queen
相关产品推荐
相关产品推荐

