2011-05-23 67 views
5

我试图写一个用户名验证,具有以下限制:正则表达式来验证用户名与至少一个字母和特殊字符

  1. 必须包含至少1个字母(A-ZA- Z)
  2. 只能包含数字,字母等什么,或者强调

下面的例子是有效的:ABC123,MY_NAME,12345a

下面的例子是无效的:123456,my_name !, _1235

我发现了一些关于使用积极lookaheads的字母contraint:(?=。* [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-轨道,我会包括我实际使用的代码:即解决您的问题

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 

回答

6

/^[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*$/:0个或多个有效字符,后跟一个字母,后跟0个或多个有效字符,约束为行的开始和结束。

+0

Sweet,它在第一次测试中缺少_或0以上的有效值,但除此之外,它的工作原理! – Paul 2011-05-23 20:02:37

2

最简单的正则表达式是:

/^[a-zA-Z0-9][a-zA-Z0-9_]*$/ 

我鼓励你现场试试http://rubular.com/

+0

这不是一个完美的解决方案:它不会允许12345a。 – 2011-05-23 19:34:00

+0

看起来这是非常接近的,但也强加了它必须以字母开头的限制,所以12345a没有通过。 – Paul 2011-05-23 19:35:03

+0

对不起,我认为12345a无效:正确的是/^[a-zA-Z0-9] [a-zA-Z0-9 _] * $/ – 2011-05-23 19:36:47

6

很容易检查模式是否有任何非法字符,并且很容易检查是否至少有一个le的垃圾。试图在一个正则表达式中做所有的事情会让你的代码难以理解。

我的建议是做两个测试。把测试的功能,使你的代码绝对死简单的理解:

if no_illegal_characters(string) && contains_one_alpha(string) { 
    ... 
} 

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

如果您不喜欢可以使用的额外功能,只是不要尝试用一个难以阅读的正则表达式来解决问题。没有奖励积分可以将尽可能多的功能填充到一个表达式中。

+0

你是对的,没有必要过分复杂这一点。 – Paul 2011-05-23 20:03:15

+0

布赖恩在你的“no_illegal_characters()”正则表达式中有一个小错误。正如现在正则表达式所说的“字符串从开始到结束必须只有1个字符”。而不是'^ [a-zA-Z0-9 _] $'它应该是'^ [a-zA-Z0-9 _] + $'。 – 2012-02-11 04:44:30

+0

谢谢@wyatt,我改变了表达式以包含'+' – 2012-02-11 12:41:34

相关问题