检测字符串是否含非法字符需先定义非法范围,再用正则匹配;常用方法是用否定字符组(如/1/)检测,注意Unicode兼容性及u标志支持。a-zA-Z0-9_-.u4e00-u9fa5 ↩

要检测字符串是否包含非法字符,关键是先明确哪些字符是“非法”的,再用正则表达式匹配它们。只要能匹配到至少一个非法字符,就说明字符串不合法。
明确非法字符范围
非法字符没有统一标准,需根据实际场景定义。常见情况包括:
- 只允许字母、数字、下划线、短横线(如用户名):非法字符就是除此以外的所有符号和空格
- 只允许中文、英文字母、数字(如表单昵称):标点、emoji、控制字符等都算非法
- 禁止特定符号(如 SQL 注入敏感字符 ';--):可逐个列出或归类处理
用否定字符组快速检测
最常用方法是写一个“只允许合法字符”的正则,然后取反判断。例如:
- 只允许英文、数字、下划线:
/^[a-zA-Z0-9_]+$/→ 若!str.match(/^[a-zA-Z0-9_]+$/)为真,说明含非法字符 - 只允许中文、英文字母、数字:
/^[u4e00-u9fa5a-zA-Z0-9]+$/ - 允许空格但禁止制表符、换行符等空白:
/^[^ ]+$/
直接匹配非法字符(更直观)
如果想直接找出非法字符,可构建“非法字符集”进行匹配:
- 匹配所有非字母数字及常见符号:
/[^a-zA-Z0-9u4e00-u9fa5_-.s]/ - 匹配常见危险字符(用于输入过滤):
['";\/ --] - 在 JavaScript 中检测:
if (str.search(/[^a-zA-Z0-9_-.u4e00-u9fa5]/) !== -1) { /* 含非法字符 */ }
注意边界与 Unicode 兼容性
中文、emoji、全角符号等属于 Unicode 多字节字符,普通 a-z 或 w 无法覆盖:
-
w在多数引擎中默认只匹配 ASCII 字母数字和下划线,不含中文 - 匹配中文推荐显式写范围:
u4e00-u9fa5(基本汉字),必要时扩展至 u3400-u4dbf(扩展A)、u20000-u2a6df(扩展B) - 现代 JS 支持
u标志,可用/p{Script=Han}/u匹配汉字,但兼容性需考虑

















