Pau*_*aul 6 regex ruby-on-rails
我正在尝试编写具有以下限制的用户名验证:
以下示例有效: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)
很容易检查图案是否有任何非法字符,并且很容易检查是否至少有一个字母.尝试在一个正则表达式中完成所有操作将使您的代码难以理解.
我的建议是做两个测试.将测试放在函数中,使您的代码绝对简单易懂:
if no_illegal_characters(string) && contains_one_alpha(string) {
...
}
Run Code Online (Sandbox Code Playgroud)
对于前者,您可以使用该模式^[a-zA-Z0-9_]+$,对于后者,您可以使用[a-zA-Z].
如果您不喜欢可以使用的额外函数,请不要尝试使用一个难以阅读的正则表达式来解决问题.将尽可能多的功能塞入一个表达式中没有奖励积分.
| 归档时间: |
|
| 查看次数: |
5960 次 |
| 最近记录: |