我想防止我的Client記錄在其name或last_name屬性中包含數字或特殊字符。
我在我的Client模型中設定了格式驗證,如下所示:
validates :name,
format: { with: /\A[a-zà-ú\s] \z/i, message: :wrong_format }
validates :last_name,
format: { with: /\A[a-zà-ú\s] \z/i, message: :wrong_format }
據我所知,這將允許包含字母字符的字串,包括像 á ( a-zà-ú) 這樣的重音符號,加上任何空白字符 ( \s),以及 0 個或多個該組合 ( )。最后/i是不區分大小寫的。
驗證作業正常,防止表單提交類似于P3ter.
問題是:使用相同的正則運算式來查詢我的 Postgres DB 以獲取與其匹配的記錄,回傳類似P3ter. 當然,在查詢中否定該正則運算式以搜索do not與其匹配的記錄不會回傳任何記錄P3ter(當我確實有它們時)。
select * from clients
where name !~* '[a-zà-ú\s] '
or last_name !~* '[a-zà-ú\s] '
// no results
我嘗試了不同的正則運算式,例如[[:alpha:][:space:]] 在表單驗證中具有相同的令人滿意的結果,但在資料庫查詢中使用時卻出現了相同的奇怪結果。
正則運算式如何用于格式驗證以防止表單提交帶有類似字串P3ter但相同的正則運算式回傳的記錄就像 P3ter在查詢中使用時一樣?
uj5u.com熱心網友回復:
問題是:
您沒有^在正則運算式模式的開頭和$結尾添加。正則運算式模式[a-zà-ú\s] 匹配ter.P3ter
^匹配每一行的開頭。while$匹配每一行的結尾。
[a-zà-ú\s]這意味著只匹配一個字符 from atoz或 from àtoú或\s一個空白字符(相當于[\r\n\t\f\v ])。
[a-zà-ú\s] 這部分匹配ter. P3ter符號表示匹配前 一個標記一次到無限次,基本上意味著匹配一個或多個,至少匹配一個字符。
解決方案:
select * from clients
where name !~* '^[a-zà-ú\s] $'
or last_name !~* '^[a-zà-ú\s] $'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/528898.html
