2017-09-21 61 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