PL/SQL使用regexp_substr分割含空值的分隔符文本问题求助
解决PL/SQL分割含空值的分隔字符串问题
原代码里用的正则表达式[^^]+只会匹配一个或多个非^的字符,遇到连续^(对应空分割项)时,会直接跳过空内容,没法捕获中间的空值,最终导致结果错位。
要正确捕获包括空值在内的所有分割项,得调整正则逻辑,改用非贪婪匹配分隔符之间的内容,同时利用regexp_substr的分组提取功能。修改后的代码如下:
declare test varchar2(20); begin select 'a^b^^d^e' into test from dual; dbms_output.put_line('1. '|| regexp_substr(test, '(.*?)(\^|$)', 1, 1, NULL, 1)); dbms_output.put_line('2. '|| regexp_substr(test, '(.*?)(\^|$)', 1, 2, NULL, 1)); dbms_output.put_line('3. '|| regexp_substr(test, '(.*?)(\^|$)', 1, 3, NULL, 1)); dbms_output.put_line('4. '|| regexp_substr(test, '(.*?)(\^|$)', 1, 4, NULL, 1)); dbms_output.put_line('5. '|| regexp_substr(test, '(.*?)(\^|$)', 1, 5, NULL, 1)); end; /
关键逻辑说明:
(.*?): 非贪婪匹配任意字符(包括空字符),直到碰到下一个分隔符或字符串结尾(\^|$): 匹配分隔符^或者字符串结束标记,作为匹配终止的条件regexp_substr第6个参数设为1,表示返回第一个分组(也就是(.*?)匹配到的内容,即我们需要的分割项)
执行这段代码后,输出会完全符合预期:
1. a 2. b 3. 4. d 5. e
内容的提问来源于stack exchange,提问作者Raymond Kelly
相关产品推荐
相关产品推荐

