黃金俠

Ruby on Rails / Rubygems / Javascript / Git

在 validates_format_of 中使用正規表示法(Regular Expression)

| Comments

在 model 的 validates_format_of 中, 有 with/without 可以透過正規表示法(Regular Expression) 來驗證欄位資料的格式是否正確

因此小弟不疑有他, 於是…

1
validates_format_of :name, :with => /[a-z\-]+/

讓 name 只能存小寫英文以及 dash(-) 值

結果… name = “ab-ac $@#” # 可存 name = “@#$%^ ” # 不可存 預期應兩者皆不可存

後來去找了 api source 發現是透過 string =~ regexp 做驗證

但小弟很不用功, 不知道 =~ 和 !~ 是什麼, 所以又再回去找以前學習的資料

於是終於明白…
=~ 用在正規表示法的意思是回傳字串中符合此表示法的位置
而上述的範例中, 因為正規表示法是 /[a-z-]+/
“ab-ac $@#” 有 ab-ac 所以匹配
”@#$%^ ” 沒有任何字串匹配
若希望正規表示法可以比對整個字串, 讓 “ab-ac $@#” 也不匹配
則必須善用正規表示法中的特殊語法

1
validates_format_of :name, :with => /\A[a-z\-]+\Z/

其中 \A 是字串開頭 \Z 是字串結尾, 也可以用 ^ 和 $ 分別表示單行開頭與結尾
這樣就可以啦!!!

參考

api source: http://api.rubyonrails.org/classes/ActiveModel/Validations/FormatValidator.html#method-i-validate_each

regular expression: http://www.regular-expressions.info/reference.html

ruby: http://guides.ruby.tw/ruby/regexp.html

Comments