1

我正在尝试在这样的模型中实现验证。

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">在这两种情况下都返回该方法。

有任何想法吗?谢谢。

4

1 回答 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修饰符匹配任何字符,.包括换行字符。

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

于 2017-09-21T20:31:09.907 回答