如何在不修改字符串本身时转义ORACLE SQL正则匹配变量
解决Oracle PL/SQL中regexp_like含特殊字符的匹配问题
你的问题核心是正则表达式的特殊字符被解析成语法而非字面量——原变量里的(BROWN)被当作正则分组,而不是你要匹配的实际文本,所以导致匹配失败。要在不修改原变量的前提下解决,只需在拼接正则时对变量中的正则特殊字符进行转义。
方案:使用REGEXP_REPLACE转义特殊字符
Oracle中,正则特殊字符(比如( ) [ ] { } \ ^ $ . | ? * +)需要用反斜杠\转义,但由于PL/SQL字符串里\本身要转义成\\,所以最终要替换成\\\1(第三个\是转义后的反斜杠,\1指代匹配到的特殊字符)。
修改后的完整代码:
declare TW_keyword varchar2(100) := 'THE QUICK (BROWN)'; tw_result varchar2(100); begin SELECT CASE WHEN regexp_like ('IS THE QUICK (BROWN) FOW', '(^|\W)'|| REGEXP_REPLACE(TW_keyword, '([\(\)\[\]\{\}\\\^\$\.\|\?\*\+])', '\\\1') ||'($|\W)') THEN 'found' ELSE 'not found' END rl INTO tw_result FROM DUAL; dbms_output.put_line(tw_result); end;
执行结果:
PL/SQL procedure successfully completed. found
说明
REGEXP_REPLACE(TW_keyword, '([\(\)\[\]\{\}\\\^\$\.\|\?\*\+])', '\\\1')会把原变量里的每个正则特殊字符都加上转义符,比如(BROWN)会被转成\(BROWN\),这样regexp_like就会把它当作字面量匹配。- 原变量
TW_keyword本身完全没改动,只是在拼接正则表达式时做了转义处理。
内容的提问来源于stack exchange,提问作者Bjawww
相关产品推荐
相关产品推荐

