我正在尝试编写具有以下限制的用户名验证:

  • 必须至少包含 1 个字母 (a-zA-Z)
  • 不得包含除数字、字母或下划线以外的任何内容

  • 以下示例有效:abc123、my_name、12345a

    以下示例无效:123456、my_name!、_1235

    我发现了一些关于对字母约束使用正向前瞻的东西:(?=.*[a-zA-Z]),看起来第二个约束可能有某种消极的前瞻,但我不确定如何将它们混合成一个正则表达式。 (注意......我不太清楚 .* 部分在前瞻中的作用......)

    是这样的吗:/(?=.*[a-zA-Z])(?!.*[^a-zA-Z0-9_])/

    编辑:

    因为问题要求使用正则表达式,所以我接受的答案是:
     /^[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*$/
    

    但是,我实际上要实现的是 Bryan Oakley 的建议,将其拆分为多个较小的检查。这使得将来在需求发生变化时更容易阅读和扩展。谢谢大家!

    因为我用 ruby​​-on-rails 标记了它,所以我将包含我实际使用的代码:
    validate :username_format
    
    def username_format
      has_one_letter = username =~ /[a-zA-Z]/
      all_valid_characters = username =~ /^[a-zA-Z0-9_]+$/
      errors.add(:username, "must have at least one letter and contain only letters, digits, or underscores") unless (has_one_letter and all_valid_characters)
    end
    

    最佳答案

    /^[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*$/ : 0 个或多个有效字符后跟一个字母,然后是 0 个或多个有效字符,限制为行的开头和结尾。

    关于ruby-on-rails - 正则表达式验证用户名至少包含一个字母且没有特殊字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6101628/

    10-14 14:00