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

atm*_*ell 11 ruby regex ruby-on-rails

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

validates_format_of :username, :with => /[a-z]/
Run Code Online (Sandbox Code Playgroud)

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

Username should use only letters, numbers, spaces, and .-_@ please.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

最好的祝福.AsbjørnMorell

Mat*_*kel 17

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

validates_format_of :username, :with => /^[-a-z]+$/
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 同意,但作为/ ^ [ - az] $/i不区分大小写 (5认同)
  • ^和$匹配行的开头和结尾.要确保没有换行符使用匹配字符串开头和结尾的\ A\Z. (3认同)
  • 它需要是`/ ^ [ - az] + $ /`(如果你想让它不区分大小写的话,在第二个斜杠之后带一个`i`).没有+,你说它必须只有一个字符长. (2认同)

laf*_*ste 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
Run Code Online (Sandbox Code Playgroud)

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

用法:

应用程序/模型/ user.rb

validates :name,
    :presence => true,
    :uniqueness => true,
    :username_convention => true
Run Code Online (Sandbox Code Playgroud)


djn*_*jna 4

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

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

[-a-z0-9@_.] 
Run Code Online (Sandbox Code Playgroud)

给你想要的效果?