如何在ORACLE APEX中使用regexp_like实现特殊字符白名单校验
Oracle regexp_like特殊字符白名单校验失效问题解决方案
问题原因
你的正则写法存在三处错误,直接导致$字符校验不通过:
- 特殊字符未纳入匹配集合:你把
$等允许的特殊字符写在了字符集[]的外面,[]仅包裹了大小写字母和数字,只有这部分字符会被判定为合法,$不在匹配范围内自然返回无效。 - 连字符位置错误:字符集内部的
-放在“和/之间,会被正则解析为ASCII码范围匹配,而非匹配普通的-字符。 - 缺少全文校验规则:现有正则只要字符串内存在任意一个允许的字符就会返回真,无法校验整个字符串所有字符都符合白名单要求,存在漏判风险。
修正后代码
declare l_value varchar2(32767) := '$'; begin if regexp_like(l_value,'^[a-zA-Z0-9$“/?\!%.,:;’()-]+$') then dbms_output.put_line('valid'); else dbms_output.put_line('invalid'); end if; end; /
修改说明
- 所有允许的特殊字符全部移入
[]字符集内部,确保$等字符被纳入白名单 - 将连字符
-移动到字符集的末尾位置,避免被识别为范围运算符,仅作为普通特殊字符匹配 - 增加开头锚点
^、结尾锚点$和量词+,强制校验整个字符串的每一个字符都属于白名单范围,避免漏判 - 字符集内部的
$不需要额外转义,在Oracle正则的[]范围内$没有特殊含义,直接书写即可正常匹配
内容的提问来源于stack exchange,提问作者stummyhurts
相关产品推荐
相关产品推荐

