我一直试图弄清楚如何使这种方法有效。
如果用户名由小写字符,数字和下划线组成,我想返回true,长度在4到16个字符之间,否则返回false。
def validate_usr(username)
if username == /A[a-z0-9_]{4,16}Z/
return true
else return false
end
end
我不知道自己做错了什么。
答案 0 :(得分:3)
我使用类似的东西:
def validate_usr(username)
!!username[/\A\w{4,16}\z/]
end
validate_usr('foo') # => false
validate_usr('foobar') # => true
validate_usr('FooBar') # => true
validate_usr('Foo Bar') # => false
validate_usr('12345678901234567') # => false
\w
是集合[a-zA-Z0-9_]
,也包含大写。如果您不想要大写,请使用[a-z0-9_]
作为集合。
[/\A\w{4,16}\z/]
是一个String快捷方式,用于将模式应用于字符串并返回匹配项。随着测试运行username[/\A\w{4,16}\z/]
返回:
username[/\A\w{4,16}\z/] # => nil, "foobar", "FooBar", nil, nil
!!
转换" truthy" /" falsey"到true
/ false
,以下是实际结果:
!!username[/\A\w{4,16}\z/] # => false, true, true, false, false
最终结果是该方法仅使用较少的代码返回所需的true / false结果。
我使用\z
而不是\Z
,因为您正在测试用户名,大概是为了在创建帐户之前的正确性。 \z
将测试应用于整个字符串,而\Z
将忽略尾随行结尾。如果您的代码以某种方式允许用户创建一个带尾随行结尾\Z
的名称,则无法为您提供准确的验证结果:
"foobar\n"[/\A\w{4,16}\Z/] # => "foobar"
"foobar\n"[/\A\w{4,16}\z/] # => nil
答案 1 :(得分:1)
这个怎么样?
def validate_usr(username)
username =~ /\A[a-z0-9_]{4,16}\z/
end
有关使用正则表达式的详细信息,请阅读以下文章。
答案 2 :(得分:0)
我认为您非常接近,我想使用money-rails
进行正则表达式比较。如果有效,它将返回0。
匹配运算符=〜可以 用于匹配正则表达式的字符串。如果在字符串中找到模式, =〜返回其起始位置;否则,它返回nil
=~
答案 3 :(得分:0)
没有正则表达式:
def validate_usr(username)
username.size.between?(4, 16) && username.count("^a-z0-9_").zero?
end