验证:只有字母,数字和 -

时间:2009-07-16 07:53:09

标签: ruby-on-rails ruby regex

我想验证我的用户,因此他们只能在用户名中使用a-z和 - 。

validates_format_of :username, :with => /[a-z]/

但是这条规则也允许空格._ @

Username should use only letters, numbers, spaces, and .-_@ please.

有什么想法吗?

祝你好运。 AsbjørnMorell

5 个答案:

答案 0 :(得分:16)

您可能需要说整个字符串必须匹配:

validates_format_of :username, :with => /^[-a-z]+$/

如果您不想在开头/结尾处匹配换行符,则可能还需要将\ A替换为^,将\ n替换为\ Z. (感谢BaroqueBobcat

追加i将使其以不区分大小写的方式匹配。 (感谢Omar Qureshi)。

(我最初也离开了+:感谢Chuck

答案 1 :(得分:10)

更复杂的解决方案,但可重复使用,并且具有更细粒度的错误消息。

自定义验证程序:

应用程序/验证器/ username_convention_validator.rb

class UsernameConventionValidator < ActiveModel::EachValidator
  def validate_each(record, field, value)
    unless value.blank?
      record.errors[field] << "is not alphanumeric (letters, numbers, underscores or periods)" unless value =~ /^[[:alnum:]._-]+$/
      record.errors[field] << "should start with a letter" unless value[0] =~ /[A-Za-z]/
      record.errors[field] << "contains illegal characters" unless value.ascii_only?
    end
  end
end

(注意它确实允许'.-- _'并且不允许非ascii,为了完整起见)

<强>用法:

应用程序/模型/ user.rb

validates :name,
    :presence => true,
    :uniqueness => true,
    :username_convention => true

答案 2 :(得分:3)

[]可能包含几个“规则”,因此[a-z0-9]给出小写字母和数字

特殊字符 - 必须在规则的开头

[-a-z0-9@_.] 

给你想要的效果?

答案 3 :(得分:1)

validates_format_of :username, :with => /^[\w\-@]*$/

注意*,表示'0或更多'

答案 4 :(得分:0)

只需更改正则表达式以匹配您的规范所声明的所有字符(\w涵盖所有字母数字字符 - 字母和数字 - 以及下划线)。

validates_format_of :username, :with => /[\w \.\-@]+/