正则表达式用于验证至少包含一个字母且没有特殊字符的用户名

Pau*_*aul 6 regex ruby-on-rails

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

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

以下示例有效: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_]*$/
Run Code Online (Sandbox Code Playgroud)

然而,我实际要实现的是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
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 6

很容易检查图案是否有任何非法字符,并且很容易检查是否至少有一个字母.尝试在一个正则表达式中完成所有操作将使您的代码难以理解.

我的建议是做两个测试.将测试放在函数中,使您的代码绝对简单易懂:

if no_illegal_characters(string) && contains_one_alpha(string) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

对于前者,您可以使用该模式^[a-zA-Z0-9_]+$,对于后者,您可以使用[a-zA-Z].

如果您不喜欢可以使用的额外函数,请不要尝试使用一个难以阅读的正则表达式来解决问题.将尽可能多的功能塞入一个表达式中没有奖励积分.


She*_*evy 6

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