Oracle REGEXP_SUBSTR移除子串失败,求正确实现方法
解决Oracle中移除指定子串的问题
为什么你的REGEXP_SUBSTR语句没生效?
你用的REGEXP_SUBSTR('STRING-EXAMPLEwithHugo','(.+)withHugo')会返回整个匹配到的字符串,因为Oracle的REGEXP_SUBSTR默认返回整个正则匹配的内容,而非括号里捕获的分组部分。你的正则表达式匹配的是从开头到"withHugo"结束的完整字符串,所以返回了原字符串本身。
正确的解决方法
方法1:用REGEXP_REPLACE直接替换(推荐)
这是最直观的方式,直接把目标子串替换为空字符串:
SELECT REGEXP_REPLACE('STRING-EXAMPLEwithHugo', 'withHugo', '') AS result FROM DUAL;
如果要确保只移除末尾的"withHugo"(避免误删字符串中间的相同子串),可以给正则加上$锚定末尾:
SELECT REGEXP_REPLACE('STRING-EXAMPLEwithHugo', 'withHugo$', '') AS result FROM DUAL;
方法2:用REGEXP_SUBSTR指定捕获组
如果一定要用REGEXP_SUBSTR提取前面的部分,需要在函数里指定要返回的捕获组索引(Oracle的REGEXP_SUBSTR支持第6个参数指定捕获组):
SELECT REGEXP_SUBSTR('STRING-EXAMPLEwithHugo', '(.+)withHugo', 1, 1, NULL, 1) AS result FROM DUAL;
这里第6个参数1表示返回正则中第一个括号捕获的内容,也就是"withHugo"之前的部分。
内容的提问来源于stack exchange,提问作者Matthias Reissner
相关产品推荐
相关产品推荐

