2014-02-20 32 views
1

我需要匹配以下字符串,基本上用於crontab。Ruby的正則表達式是否符合標準?

0 2 * * 0,1,2,3,4,5,6 

其爲 「0 2 * *」,其次是至多7個號碼從0到6(即,七天周的)由逗號分隔。以下是我從Ruby獲得的內容。

$ irb 
irb> /0 2 \* \* [0-6]((,[0-6]){0,6})/ =~ "0 2 * * 1,2" 
=> 0 
irb> /0 2 \* \* [0-6]((,[0-6]){0,6})/ =~ "0 2 * * 7" 
=> nil 
irb> /0 2 \* \* [0-6]((,[0-6]){0,6})/ =~ "0 2 * * 0,1,2,3,4,5,6,7" 
=> 0 

對於最後一個,它爲什麼仍然匹配?

然後我使用http://regexpal.com/測試相同的正則表達式。它按預期工作,這表明我的正則表達式是正確的。

+1

爲什麼它不匹配? – sawa

+0

哪個「標準」?有一堆他們。 –

回答

2

由於您的正則表達式不是錨定的,它將匹配包含它的任何字符串,即使該字符串在該模式之前或之後有額外的字符。

更改此:

/0 2 \* \* [0-6]((,[0-6]){0,6})/ 

這樣:

/^0 2 \* \* [0-6]((,[0-6]){0,6})$/ 

而當你想到它會工作。 ^錨定到一行的開頭; $到最後。

當您嘗試在http://regexpal.com最後的正則表達式和字符串,你可能會注意到匹配字符串的部分突出顯示:

0 2 * * 0,1,2,3, 4,5,6,7

只有被突出顯示匹配的部分。這表明在這種情況下regexpal和Ruby正在做同樣的事情。

+0

謝謝,它的工作原理。但你能解釋爲什麼它與錯誤的字符串匹配?因爲即使你不錨,也不應該匹配。這似乎很糟糕。 – user180574

+0

@ user180574你是否期望最後一個字符串不匹配,因爲它有一個7?這7個並不重要,因爲正則表達式在達到7之前就匹配了。正則表達式引擎從來沒有在最後看到',7'。 –

+0

謝謝,我有一些誤解,現在很清楚。 – user180574