2017-09-21 31 views
1

我试图在这样的模型中实现验证。Brakeman正则表达式锚不足的验证警告

validates_format_of :field, with: /[0-9]/, message: 'must have at least one number (0-9)' 

制动手检测这个Format Validation安全问题,并建议到正规表达式之间添加锚点。

对使用​​/ [0-9] /的'field'进行验证不够。在第54行附近使用\ A和\ z作为锚点

如果我添加这些锚点,正则表达式停止工作,所以我不知道在这种情况下该怎么做。以下是我使用rails c所做的测试。

"asdf1234".match(/\A[0-9]\z/) # => nil 
"foobar1".match(/\A[0-9]\z/) # => nil 

我需要该方法返回#<MatchData "1">在这两种情况下。

任何想法? 谢谢。

回答

1

如果需要前后匹配具有内至少1个数字的字符串,以及其他任何字符,你可以使用

/\A[^0-9]*[0-9].*\z/m 

或只是

/\A.*[0-9].*\z/m 

详细

  • \A - 字符串的开头
  • [^0-9]* - 零个或多个字符不是ASCII数字
  • [0-9]其他 - 一个ASCII数字
  • .* - 任何0+字符,尽可能多的,直至
  • \z - 字符串的结尾。

m修饰符使.匹配任何字符,包括换行符char。

实际上,/\A.*[0-9].*\z/m会慢一些,因为第一个.*会一次抓住所有的字符串,然后会回溯到最后一位数字。第一个更加优化。

+1

这样做,谢谢你的解决方案和解释。 – CatBrownie