Flutter/Dart用户名验证:如何检测含禁用词的用户名
用户名禁用词校验实现方案
要实现不区分大小写、拦截任意位置包含禁用词的校验,最简便的方式是利用正则表达式的不区分大小写特性,将禁用词数组转换为匹配子串的正则规则,具体实现如下:
核心实现逻辑
- 定义禁用词数组,按需添加需拦截的词汇
- 对每个禁用词做正则特殊字符转义(避免禁用词含
.、*等字符导致正则失效) - 生成不区分大小写的正则规则,匹配包含任意禁用词的子串
- 在原验证流程中插入禁用词校验步骤
修改后的完整代码
Future<String?> usernameValidator({required String? username}) async { // 定义禁用词数组,可根据需求扩展 const forbiddenWords = ['Charlie', 'Admin', 'Root']; // Validates username complexity bool isUsernameComplex(String? text) { final String _text = (text ?? ""); String? p = r"^(?=(.*[ @$!%*?&=_+/#^.~`]))"; RegExp regExp = RegExp(p); return regExp.hasMatch(_text); } // 校验是否包含禁用词 bool containsForbiddenWord(String text) { // 转义禁用词中的正则特殊字符,防止破坏正则语法 final escapedWords = forbiddenWords.map((word) => RegExp.escape(word)).toList(); // 生成匹配任意禁用词的正则,不区分大小写 final pattern = escapedWords.join('|'); final regExp = RegExp(pattern, caseSensitive: false); return regExp.hasMatch(text); } final String _text = (username ?? ""); // 禁用词校验(优先执行,提前拦截无效请求) if (containsForbiddenWord(_text)) { return "Username contains restricted words."; } // Complexity check if (isUsernameComplex(_text)) { return "Username can only contain letters and numbers."; } // Length check else if (_text.length < 3 || _text.length > 16) { return "Username must be between 3-16 characters long."; } return null; }
关键细节说明
- 正则转义:使用
RegExp.escape(word)处理禁用词,避免禁用词中的特殊字符(如.会匹配任意字符)干扰正则逻辑 - 大小写无关:通过
caseSensitive: false配置,自动匹配Charlie、charlie、ChaRlie等大小写变体 - 全位置匹配:正则默认匹配子串,无需添加
^或$锚点,可拦截Charlieee、213charlie、ch1chaRliE32这类前后带其他字符的情况 - 校验顺序优化:将禁用词校验放在最前面,提前拦截不符合规则的用户名,减少后续不必要的校验开销
内容的提问来源于stack exchange,提问作者themag
相关产品推荐
相关产品推荐

