Redshift中提取#$#后字符?REGEXP_REPLACE/REGEXP_SUBSTR用法咨询
解决方案:提取'#$#'之后的字符(兼容无标识场景)
方法1:使用REGEXP_REPLACE
核心逻辑是替换掉从字符串开头到#$#的所有内容,若目标标识不存在,替换操作不会生效,自动返回原字符串。
正则说明:
^:匹配字符串起始位置.*?:非贪婪匹配任意字符(避免遇到多个#$#时错误截取)#\$#:匹配目标标识,其中$是正则特殊字符,必须用\转义
示例代码(Oracle环境):
DECLARE v_str VARCHAR2(100) := 'AAA#$#DEFAEFGAA'; v_result VARCHAR2(100); BEGIN v_result := REGEXP_REPLACE(v_str, '^.*?#\$#', ''); DBMS_OUTPUT.PUT_LINE(v_result); -- 输出:DEFAEFGAA -- 测试无标识场景 v_str := 'ABCDE'; v_result := REGEXP_REPLACE(v_str, '^.*?#\$#', ''); DBMS_OUTPUT.PUT_LINE(v_result); -- 输出:ABCDE END; /
方法2:使用REGEXP_SUBSTR配合NVL
通过正则捕获组提取#$#之后的内容,若未匹配到标识,用NVL返回原字符串。
正则说明:
#\$#(.*):匹配#$#并捕获其后的所有字符((.*)为捕获组1)
示例代码(Oracle环境):
DECLARE v_str VARCHAR2(100) := 'AAA#$#DEFAEFGAA'; v_result VARCHAR2(100); BEGIN v_result := NVL(REGEXP_SUBSTR(v_str, '#\$#(.*)', 1, 1, NULL, 1), v_str); DBMS_OUTPUT.PUT_LINE(v_result); -- 输出:DEFAEFGAA -- 测试无标识场景 v_str := 'ABCDE'; v_result := NVL(REGEXP_SUBSTR(v_str, '#\$#(.*)', 1, 1, NULL, 1), v_str); DBMS_OUTPUT.PUT_LINE(v_result); -- 输出:ABCDE END; /
扩展:提取最后一个#$#之后的内容
如果字符串存在多个#$#,需要取最后一个标识后的内容,只需调整正则为贪婪匹配:
- REGEXP_REPLACE方案:将正则改为
^.*#\$#(去掉?,转为贪婪匹配) - REGEXP_SUBSTR方案:将正则改为
#\$#(.*)$(结合$匹配行尾,捕获最后一个标识后的内容)
内容的提问来源于stack exchange,提问作者JIT
相关产品推荐
相关产品推荐

