2010-08-23 68 views
0

任何人都可以解釋爲什麼下面的測試沒有通過。正則表達式在我不想要的地方進行匹配。意外的正則表達式匹配

我想找到的文本匹配,與電話,傳真或網絡,但由於某些原因,在測試的網址是得到一個比賽開始:

def test_url_should_match 
    assert_no_match(/^[tel|fax|web]/i, "www.jehall.co.uk") 
    end 
+0

可能重複[是我的preg_match語法有效?](http://stackoverflow.com/questions/3246239/is-my-preg-match-syntax-valid) – kennytm 2010-08-23 15:22:15

回答

3

試一下

assert_no_match(/^(tel|fax|web)/i, "www.jehall.co.uk") 

這應該有效。否則,你會匹配字符,即網絡中的w將匹配。

2

您應該使用

/^(?:tel|fax|web)/i 
+0

爲什麼你有貓王笑臉?: 「那裏? – Aillyn 2010-08-23 15:24:00

+0

@Aillyn:這樣它就不會創建捕獲。 – sepp2k 2010-08-23 15:30:36

+0

@Aillyn:你在暗示'?:'不應該在那兒嗎? – 2010-08-23 18:10:46

4

[...]在正則表達式中指定一個character class,它告訴正則表達式引擎匹配括號中包含的這些字符之一。因此,[tel|fax|web]的意思是「匹配t或e或l或|或f或a或x或w或e或b」(|在課堂上多次出現的事實是無關緊要的)。由於字符串以字符類中的w開始 - 模式匹配。

正如其他答案所說,你想使用括號(...)來代替你的替代。

+0

事實上,'|'多次出現的事實*是相關的,因爲它會產生一個警告,如果OP實際上對* read *感到困擾的話,它已經告訴他什麼是錯誤的:'warning:character class有重複的範圍:/ [^ [tel | fax | web]] /' – 2010-08-23 17:59:48

+0

@Jörg在irb或Rubular中沒有給出警告,但公平點。 – 2010-08-23 18:06:42