2012-12-21 58 views
1

失敗我有以下類型簡單的regex檢查在軌模型

validates :callback_handle, :format => { :with => /[_0-9a-zA-Z]+/ix }, :unless => "callback.nil?" 

的檢查,我不想任何非0-9,A-Z A-Z字符通過。所以我把callback_handle設置爲 「!alksjda」(注意!開頭)。 此測試不會失敗。我究竟做錯了什麼?

我試過IRB幾件事情:這是我的了:

1.9.2-p320 :001 > a = "!askldjlad" 
=> "!askldjlad" 
1.9.2-p320 :002 > a =~ /[_0-9a-zA-Z]+/ix 
=> 1 
1.9.2-p320 :003 > a = "askldjlad" 
=> "askldjlad" 
1.9.2-p320 :004 > a =~ /[_0-9a-zA-Z]+/ix 
=> 0 

我認爲它會返回false或零失敗找到了比賽。

有人能告訴我這裏有什麼不對嗎?

編輯: 我發現=〜會返回比賽的位置。 所以這個問題變成了我怎麼不允許有任何其他角色的東西不匹配?

+1

嘗試使用'/ \ w + $/ix' –

回答

3

你的正則表達式仍然能夠匹配,因爲至少有1字在你的字符串是字母數字。如果你想確保整個字符串匹配,那麼你應該定義匹配的開始和結束。

老:

a =~ /[_0-9a-zA-Z]+/ix 

這是說: 「比賽的地方,這些字符中的至少一個在a

新:

a =~ /\A[_0-9a-zA-Z]+\z/ix 

這是說」 開始之初該字符串,則匹配至少只有這些字符中的一個,後面跟着字符串的末尾「a

+0

不是,這是說關於**行**,而不是**字符串**。 「 」一\ n「! =〜/^[_ 0-9a-zA-Z] + $/ix'返回'0'。您需要使用'\ A' +'\ z'對:'/ \ A [_0-9a-zA-Z] + \ z/ix'。 – jdoe

+0

好點。如果你不先做,我會編輯它。 – jdl

+0

「x」修飾符是什麼? –

1

你的正則表達式只是要求你的字符串包含1個或多個有效字符...這應該修復它:

validates :callback_handle, :format => { :with => /^[_0-9a-zA-Z]+$/ix }, :unless => "callback.nil?" 
+0

檢查** [this](http://stackoverflow.com/questions/13995210/simple-regex-check-failing-in-a-rails-model#comment19317621_13995278) **評論。 – jdoe