否定validates_format_of的正则表达式

时间:2012-06-26 14:54:49

标签: ruby-on-rails regex validation

在我的rails模型中,我有一些模板系统。我想确保用户编辑它不会造成意外错误,所以我使用了一些简单的验证器。

他们可以使用##user_id##之类的标记,以后会被替换。我想确保他们没有输入###user_id##包含太多#的内容,因此不能在字段中显示任何###(或####)。

class Template
  validates_format_of :text, :with => /##user_id##/, 
    :message => "##user_id## must be present"
  validates_format_of :text, :not_with => /###/, 
    :message => "Too many #"
end

很遗憾没有:not_with选项......有没有机会使用:with - 正则表达式来解决它?还是应该使用单独的validate方法?

我尝试了一些否定的预测,但由于(大多数情况下)有几个##且只有一个###,因此它们总是匹配其中一个。

3 个答案:

答案 0 :(得分:4)

使用:without选项:

validates_format_of :text, :without => /###/, :message => "Too many #"

答案 1 :(得分:1)

这个怎么样......

validates_format_of :text, :with => /(^|[^#])##user_id##($|[^#])/

编辑:我用正则表达式复制了acheong87的{​​{3}}示例。

答案 2 :(得分:0)

你能做这样的事吗?

    /^(.(?!###+user_id##|##user_id###+))*$/

这是一个现场演示:http://rubular.com/r/SPwsyDlj0y

在(更多)英语中,它说,

  

###+user_id####user_id###+后面没有字符的字符串。