【发布时间】:2010-01-24 04:08:52
【问题描述】:
我想根据这个架构验证用户名:
- 允许的字符:字母、数字、连字符、下划线
- 第一个字符必须是字母或数字
- 用户名不能全是数字
这个正则表达式满足上面的1和2,但是我不知道怎么满足3:
/^[a-zA-Z\d][\w\-]+$/
(我正在使用 Ruby,如果相关的话)
【问题讨论】:
我想根据这个架构验证用户名:
这个正则表达式满足上面的1和2,但是我不知道怎么满足3:
/^[a-zA-Z\d][\w\-]+$/
(我正在使用 Ruby,如果相关的话)
【问题讨论】:
效率不高,但简单:
/^(?!\d+$)[a-zA-Z\d][\w\-]+$/
前瞻只是意味着:“接下来的不是一串一直持续到最后的数字”。
【讨论】:
如果您可以进行两次传递,则更简单、更快的第二次传递正则表达式是:
/[^\d]/
这只是匹配任何不是数字的东西,它只需要匹配一个并且它会提前终止。您实际上不需要在这里严格,因为第一遍已经拒绝了不允许的字符。
【讨论】:
不理想,但很简单:使用正则表达式 /^.*[a-zA-Z_\-].*$/ 进行第二次传递
只要确保两者都通过,你会没事的。
【讨论】:
/\D/ 也会做同样的事情。无需从头到尾匹配。
[-a-z_](我假设你正在做一个不区分大小写的匹配;如果不是,那么[-A-Za-z_],当然。不用担心开始,结束或其他任何东西——如果它通过了第一个,只要确保任何地方都有一个字母、下划线或连字符。
match() 和search()/find() 方法。前者尝试匹配整个字符串,而后者尝试在任意点匹配。
我会使用验证所需的正则表达式,然后是:
passwd.to_i.to_s.length != passwd.length
在通过主要验证后验证passwd 不是一串数字。
【讨论】:
还有另一种方式,尽管它的性能可能不如 Max 的:
/^[a-z0-9][-\w]*[-_a-z][-\w]*$/i
【讨论】: