2013-02-20 18 views
0

我不確定標題是否準確,所以如果這是重複的,我很抱歉。捕獲量化字符集或單個字符

從我的理解,(a|b)匹配ab。這可以延長,如([\w]|@)匹配一個單詞字符或@

我的問題是:爲什麼這不適用於量詞?我試圖匹配一個量化的字符集或單個@,但([\w\.\-]*|@)將不匹配@

任何人都可以解釋這種行爲的原因,也許正確的方法來做到這一點?

回答

3

*表示「匹配零或更多」。因此,你的模式的第一部分可以成功匹配nothing(一個空字符串)。第一部分總是成功的,所以它從不嘗試第二部分。

你有兩個選擇來解決這個問題:

  1. 使用+至少需要一個字符:([\w\.\-]+|@)
  2. @第一:(@|[\w\.\-]*)。如果你仍然想要一個空字符串匹配,這很有用,但是如果它匹配的話,你想匹配@

更新: Linuxios表明,紅寶石不會允許*子模式中。我不是一個Ruby的用戶,但如果這是真的,你可以得到選項2的這樣的等價物:

(@|[\w\.\-]+)? 
+0

就是這樣,非常感謝您的解釋。 – pduersteler 2013-02-20 14:39:34

+0

你的第二種模式是正確的。這應該工作得很好。 – Linuxios 2013-02-20 14:55:48

1

紅寶石不允許的或可變的量詞可以匹配什麼,因爲沒有任何東西總是匹配,使得或毫無意義。

+0

謝謝。不,我正在嘗試匹配來自DNS區域文件的行。 – pduersteler 2013-02-20 14:38:57

+0

@ dan1111:可以匹配0或更多的變量量詞。 +是* 1 *或更多。但是*和?是0或(更多/ 1) – Linuxios 2013-02-20 14:40:32

+0

@pduersteler「修正。對不起。它只是這樣看待,我不得不指出你真正的正則表達式,如果你*我們*試圖匹配電子郵件 – Linuxios 2013-02-20 14:41:07

相關問題