我希望根据以下模式验证用户名:
- 允许字符:字母、数字、连字符、下划线
- 第一个字符必须是字母或数字
- 用户名不能全部由数字组成
这个正则表达式满足了1和2的要求,但我无法想出如何满足第3个要求:
/^[a-zA-Z\d][\w\-]+$/
(如果相关的话)我正在使用Ruby。
虽然不太高效,但是非常简单:
/^(?!\d+$)[a-zA-Z\d][\w\-]+$/
这个前瞻正则表达式的意思是:"后面不是一连串数字直到最后"。
如果您可以使用两个正则表达式,第二次更简单和更快的匹配方法是:
/[^\d]/
这只匹配任何不是数字的内容,它仅需要匹配一次并尽早终止。在这里您不需要严格要求,因为第一次匹配已经拒绝了不允许的字符。
虽然不是最理想的方法,但很简单:使用正则表达式/^.*[a-zA-Z_\-].*$/
进行第二次匹配。
只要确保两次匹配都通过,就没问题了。
[-a-z_]
(我假设您正在进行不区分大小写的匹配;如果不是,则当然是[-A-Za-z_]
。不需要担心开头、结尾或其他任何事情——如果它通过了第一个,只需确保有字母、下划线或连字符即可。 - Jaymatch()
和search()
/find()
方法。前者尝试匹配整个字符串,而后者则尝试在任何位置匹配。 - Max Shawabkehpasswd.to_i.to_s.length != passwd.length
在通过主要验证后,验证passwd
不是数字字符串。
另一种方法,虽然可能不如Max的表现好:
/^[a-z0-9][-\w]*[-_a-z][-\w]*$/i