编写正则表达式以验证Ruby中的用户名

时间:2016-01-29 20:39:42

标签: ruby regex

我一直试图弄清楚如何使这种方法有效。

如果用户名由小写字符,数字和下划线组成,我想返回true,长度在4到16个字符之间,否则返回false。

def validate_usr(username)
  if username == /A[a-z0-9_]{4,16}Z/
    return true
  else return false
  end
end

我不知道自己做错了什么。

4 个答案:

答案 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