You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter/Dart用户名验证:如何检测含禁用词的用户名

用户名禁用词校验实现方案

要实现不区分大小写、拦截任意位置包含禁用词的校验,最简便的方式是利用正则表达式的不区分大小写特性,将禁用词数组转换为匹配子串的正则规则,具体实现如下:

核心实现逻辑

  1. 定义禁用词数组,按需添加需拦截的词汇
  2. 对每个禁用词做正则特殊字符转义(避免禁用词含.、*等字符导致正则失效)
  3. 生成不区分大小写的正则规则,匹配包含任意禁用词的子串
  4. 在原验证流程中插入禁用词校验步骤

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:20:24