我不確定標題是否準確,所以如果這是重複的,我很抱歉。捕獲量化字符集或單個字符
從我的理解,(a|b)
匹配a
或b
。這可以延長,如([\w]|@)
匹配一個單詞字符或@
。
我的問題是:爲什麼這不適用於量詞?我試圖匹配一個量化的字符集或單個@
,但([\w\.\-]*|@)
將不匹配@
。
任何人都可以解釋這種行爲的原因,也許正確的方法來做到這一點?
我不確定標題是否準確,所以如果這是重複的,我很抱歉。捕獲量化字符集或單個字符
從我的理解,(a|b)
匹配a
或b
。這可以延長,如([\w]|@)
匹配一個單詞字符或@
。
我的問題是:爲什麼這不適用於量詞?我試圖匹配一個量化的字符集或單個@
,但([\w\.\-]*|@)
將不匹配@
。
任何人都可以解釋這種行爲的原因,也許正確的方法來做到這一點?
*
表示「匹配零或更多」。因此,你的模式的第一部分可以成功匹配nothing(一個空字符串)。第一部分總是成功的,所以它從不嘗試第二部分。
你有兩個選擇來解決這個問題:
+
至少需要一個字符:([\w\.\-]+|@)
@
第一:(@|[\w\.\-]*)
。如果你仍然想要一個空字符串匹配,這很有用,但是如果它匹配的話,你想匹配@
。更新: Linuxios表明,紅寶石不會允許*
子模式中。我不是一個Ruby的用戶,但如果這是真的,你可以得到選項2的這樣的等價物:
(@|[\w\.\-]+)?
紅寶石不允許的或可變的量詞可以匹配什麼,因爲沒有任何東西總是匹配,使得或毫無意義。
謝謝。不,我正在嘗試匹配來自DNS區域文件的行。 – pduersteler 2013-02-20 14:38:57
@ dan1111:可以匹配0或更多的變量量詞。 +是* 1 *或更多。但是*和?是0或(更多/ 1) – Linuxios 2013-02-20 14:40:32
@pduersteler「修正。對不起。它只是這樣看待,我不得不指出你真正的正則表達式,如果你*我們*試圖匹配電子郵件 – Linuxios 2013-02-20 14:41:07
就是這樣,非常感謝您的解釋。 – pduersteler 2013-02-20 14:39:34
你的第二種模式是正確的。這應該工作得很好。 – Linuxios 2013-02-20 14:55:48