我试图在这样的模型中实现验证。
validates_format_of :field, with: /[0-9]/, message: 'must have at least one number (0-9)'
Brakeman检测到这是一个Format Validation
安全问题,它建议在正则表达式之间添加锚点。
'字段'的验证不足使用/ [0-9] /。使用\ A和\ z作为第54行附近的锚点
如果我添加这些锚点,正则表达式将停止工作,因此我不知道在这种情况下该怎么做。这是我使用rails c
进行的测试。
"asdf1234".match(/\A[0-9]\z/) # => nil
"foobar1".match(/\A[0-9]\z/) # => nil
我需要在两种情况下返回#<MatchData "1">
方法。
有什么想法吗? 感谢。
答案 0 :(得分:1)
如果你需要匹配一个内部至少有1位数的字符串,以及之前和之后的任何其他字符,你可以使用
/\A[^0-9]*[0-9].*\z/m
或只是
/\A.*[0-9].*\z/m
<强>详情
\A
- 字符串开头[^0-9]*
- 除ASCII数字以外的零个或多个字符[0-9]
- ASCII数字.*
- 任意0个字符,尽可能多,直到\z
- 字符串结束。 m
修饰符使.
匹配任何字符,包括换行符。
实际上,/\A.*[0-9].*\z/m
会慢一点,因为第一个.*
会一次抓取所有字符串,然后会回溯以找到最后一个数字。第一个更优化。