我正在尝试编写具有以下限制的用户名验证:
以下示例有效: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/