关于使用REGEXP_SUBSTR函数提取指定子串的正则表达式求助
关于使用REGEXP_SUBSTR函数提取指定子串的正则表达式求助
我来帮你搞定这两个REGEXP_SUBSTR的子串提取问题,针对你的两个场景分别调整正则表达式就能得到想要的结果啦:
场景1:提取“/”和“-”之间的字符串
你的需求是从字符串XXXXX-XXX#8#FF###TTTTTTT/SM123456789-JSMILEGGM 1.1####里提取/和-之间的SM123456789。
你原来用的正则[^/-]+$是匹配字符串末尾所有不是/和-的字符,这和需求不符。正确的思路是定位到/之后、-之前的内容,用捕获组来提取这部分:
SELECT REGEXP_SUBSTR('XXXXX-XXX#8#FF###TTTTTTT/SM123456789-JSMILEGGM 1.1####', '/(.*?)-', 1, 1, NULL, 1) new_str
简单解释:
/:精准匹配分隔符/(.*?):非贪婪匹配任意字符(直到遇到第一个-就停止),括号标记这是我们要提取的目标内容(捕获组)-:匹配结束的分隔符-- 最后一个参数
1:指定返回第一个捕获组的内容,也就是我们要的中间字符串
执行后就能得到预期输出:SM123456789
场景2:提取第一个“/”之后的所有内容
你的需求是从字符串XXXXX-XXX#8#FF###TTTTTTT/SM123456789/JSMILEGGM 1.1####里提取第一个/之后的全部内容SM123456789/JSMILEGGM 1.1####。
你原来用的[^/]+是匹配第一个/之前的非/字符,完全搞反了方向。这里我们可以用正则匹配第一个/之后的所有内容,同样用捕获组提取:
SELECT REGEXP_SUBSTR('XXXXX-XXX#8#FF###TTTTTTT/SM123456789/JSMILEGGM 1.1####', '.*?/(.*)', 1, 1, NULL, 1) new_str
简单解释:
.*?/:非贪婪匹配第一个/之前的所有内容(包括/本身),相当于跳过前面不需要的部分(.*):匹配/之后的所有内容,作为我们要的捕获组- 最后一个参数
1:返回这个捕获组的内容,也就是第一个/之后的全部字符串
执行后就能得到预期输出:SM123456789/JSMILEGGM 1.1####
内容来源于stack exchange
相关产品推荐
相关产品推荐

