最基础可靠的白名单定义方式是用[...]明确列出允许字符或范围,如[aei]、[a-z0-9];支持unicode属性(如\p{l})和减法语法(如--[^\_%]),需引擎兼容。
![如何利用正则表达式的“字符类 [...]”构建自定义的合法原始字符白名单](https://img.php.cn/upload/article/001/242/473/177798813525379.png?x-oss-process=image/resize,p_40)
直接用 [...] 定义白名单是最基础也最可靠的方式:方括号内列出所有允许出现的字符(或范围),正则引擎只接受其中任意一个。
明确列出单个字符
适合字符数量少、无规律的情况。例如只允许字母 a、e、i:
-
[aei]—— 匹配单个字符,只能是 a、e 或 i - 可混用大小写:
[aeiAEI] - 可加入数字或符号:
[aei0-9_](注意下划线无需转义)
使用连字符定义连续范围
大幅提升简洁性,尤其适用于 ASCII 字母与数字:
-
[a-z]匹配任意小写字母;[A-Z]匹配大写;[0-9]匹配数字 - 组合写法:
[a-zA-Z0-9]表示常见“字母数字”白名单 - 支持跨段范围:
[0-9a-fA-F]可匹配十六进制字符
嵌入 Unicode 类别提升兼容性
处理中文、日文、emoji 等多语言文本时,纯 ASCII 范围不够用:
-
[\p{L}\p{N}_]——\p{L}匹配任意 Unicode 字母(含中文、希腊字母等),\p{N}匹配任意数字(如阿拉伯数字、罗马数字、汉字数字) - 需确保正则引擎支持 Unicode 属性(Java、.NET、PCRE2、现代 JavaScript 均支持)
- 注意:JavaScript 中需添加
u标志,如/[\p{L}\p{N}_]/u
排除特定字符实现“减法白名单”
当白名单主体是大范围(如全部 Unicode 字符),仅需剔除少数非法字符时适用:
- Java 支持交集减法:
[\u0000-\uFFFF&&[^_%]]表示“U+0000 到 U+FFFF 中,去掉 _ 和 %” - .NET 支持字符类减法:
[\p{L}\p{N}--[_%]](双减号表示减去) - 其他引擎(如 Python 的
regex模块)也支持类似语法,但原生re不支持











