2017-04-21 81 views
-4

在Ruby 2.2.4的Rails應用程序中有一個簡單的電子郵件檢查正則表達式。 的正則表達式是:如何在Ruby中匹配=〜

email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

所述比較的代碼是:

email =~ email_regex 

對於email作爲[email protected](用於測試),上述返回0代碼這是不相等的。但在http://rubular.com/,他們是平等的。

然而===回報true

email_regex === email 

爲什麼=~不在這裏工作了?

+3

'0'意味着比賽在位置發現0 –

+2

'0'是紅寶石truthy。 '0'表示它在pos'0'中匹配。 – mudasobwa

回答

1

從紅寶石String#=~文檔:

STR =〜OBJ→Fixnum對象或零

如果obj Regexp和使用它作爲一個模式來匹配STR,並返回該位置比賽開始,如果沒有比賽,則爲零。

由於它返回0這意味着已找到匹配項並且它從索引0開始。

+0

該方法返回比較結果爲'return email =〜email_regex'或'return email_regex === email'。前者返回false,後者返回true。顯然'0'被視爲'false'而不是'true'。這很奇怪。 – user938363

1

是的,那0可能會令人困惑,但它是一個truthy值在Ruby中,就像true

但是,如果你喜歡的truefalse結果,還有在Ruby中String#match? 2.4 +:

email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
email = '[email protected]' 

email.match? email_regex 
#=> true 
+0

該方法返回比較結果爲'return email =〜email_regex'或'return email_regex === email'。前者返回'false',後者返回'true'。顯然0被視爲錯誤但不是真實的。這是奇怪的 – user938363

+0

@ user938363與給定的值,'email =〜email_regex'返回'0'和'email.match? email_regex'返回'true',就像'email_regex === email'一樣。 – Stefan