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)
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)
[] 可能包含多个“规则”,因此 [a-z0-9] 给出小写字母和数字
特殊字符 - 必须出现在规则的开头
做
[-a-z0-9@_.]
Run Code Online (Sandbox Code Playgroud)
给你想要的效果?