Oracle中REGEXP_REPLACE提取问号前目标数字的正确方法
需求说明
从指定格式的字符串中,提取问号?前紧邻的连续数字段,示例如下:
- 输入值:
abc#95988287?3008009095 - 预期返回结果:
95988287
原有写法错误原因
之前尝试的SQL语句如下:
SELECT REGEXP_REPLACE('abc#95988287?3008009095', '\?[1,0,2,3,4,5,6,7,8,9]', '') FROM dual;
运行后得到错误结果abc#95988287008009095,问题点有两个:
- 正则匹配范围错误:
'\?[1,0,2,3,4,5,6,7,8,9]'仅匹配问号和问号后的第一个数字,替换时只删除了这两个字符,既没有去掉问号前的非数字前缀,也没有删除问号后剩余的所有内容 - 字符组写法错误:方括号内的逗号会被识别为待匹配的普通字符,属于无效写法,数字匹配直接用
\d或者[0-9]即可,不需要枚举单个数字还加逗号分隔
正确REGEXP_REPLACE写法
通过正则捕获组直接提取目标内容即可,正则规则匹配整个字符串的三段结构,仅保留问号前紧邻的连续数字段:
^.*?:非贪婪匹配字符串开头到目标数字段之前的所有非目标内容(\d+):捕获问号前紧邻的连续数字,也就是需要提取的目标值\?.*$:匹配问号本身以及问号后到字符串结尾的所有非目标内容
替换时直接用第一个捕获组的内容替换整个原字符串,正确SQL如下:
SELECT REGEXP_REPLACE( 'abc#95988287?3008009095', '^.*?(\d+)\?.*$', '\1' ) AS target_number FROM dual;
执行上述语句即可返回预期结果95988287。
内容的提问来源于stack exchange,提问作者Yogita Sharma
相关产品推荐
相关产品推荐

