2011-03-09 23 views
8

符合以下條件:如何使Ruby中的正則表達式成爲可選的一部分?

On Mar 3, 2011 11:05 AM, "mr person" 
wrote: 

我有以下的正則表達式:

/(On.* (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, [12]\d{3}.* at \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:)/m 

有沒有一種方法,使在選購?所以如果它很好,如果不是,它仍然匹配?

+1

+1否定-1,我只是不認爲它的權利是全部,對不起... – sln 2011-03-09 01:59:09

+0

@sln:你的意思是「否定」?另外,你爲什麼覺得downvote是不合理的? – 2011-03-09 02:12:49

回答

11

當然。把它放在括號內,在它後面加一個問號。包括其中一個空格(否則,如果缺少「at」,則會嘗試匹配兩個空格。)(at)?(或其他人建議的,(?:at)?以避免它被捕獲)。

+0

試過了,它不起作用 – AnApprentice 2011-03-09 00:06:58

+0

哦,等待它是因爲我有一個空間後。謝謝 – AnApprentice 2011-03-09 00:07:34

+0

您還需要在其中包含一個空格,否則它會嘗試匹配兩個空格。我會編輯。 – kindall 2011-03-09 00:08:50

10

不要忘記(?:)確保括號內的表達不會被捕獲

(?:at)? 
+0

這適用於複雜的表情,例如/(\ W +(\ [\ W + \](:\ [\ d + \]))+?)(?:\ [\ W + \])/; – Donato 2014-11-11 20:58:29

+0

我從來不知道如何使它不被捕獲,當我使用parens的可選項目,謝謝! – 2016-11-18 16:39:09

1

當然,你只需要組的可選部分...

(at)* 

,好吧,我想這將匹配at at at,所以你可能想這樣做:

(at)? 
+0

這應該是'?',而不是'*'。 – 2011-03-09 00:11:25

+0

+1編輯! – 2011-03-09 02:08:54

2

其他人得到你的答案。這只是一個旁白:正則表達式。

當你在正則表達式中說「條件」時,它指的是正則表達式語言。像任何語言一樣,它是代碼執行中的一個分支,但代碼是不同的正則表達式路徑,正則表達式的「代碼」。

因此,在psudo代碼中:if(評估爲true)執行此常規子表達式,否則請執行此其他子表達式。

此條件存在於高級正則表達式引擎中... Perl。
Perl使用存在的最高級的正則表達式引擎。在版本6及更高版本中,它將成爲語言的一個組成部分,代碼和表達無縫地融合在一起。

Perl 5.10有這個構造:
(?(condition)yes-pattern | no-pattern)。

編輯只是一個警告,Perl去的地方,每一種語言都遵循正則表達式。

+0

+1。我繼續編輯問題以使用「可選」代替。 – 2011-03-09 06:01:54

相關問題