如何在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 

有没有办法让at在可选? 所以,如果它很好,如果没有,它仍然匹配?

当然。 把它放在括号中,在它后面加一个问号。 包括其中一个空格(否则如果“at”丢失,你将试图匹配两个空格。) (at )? (或者像其他人建议的那样, (?:at )?以避免被捕获)。

不要忘记(?:)以确保不会捕获括号中的表达式

 (?:at)? 

当然,你只需要对可选部分进行分组……

  (at )* 

而且,好吧,我想这会在at处匹配,所以你可能只想做:

  (at )? 

其他人得到你的答案。 这只是一个旁边的重复:正则表达式。

当你在正则表达式中说“条件”时,它指的是正则表达式语言。 像任何语言一样,它在代码执行中是一个分支,但代码是一个不同的正则表达式路径,正则表达式的“代码”。

所以在psudo代码中:if(评估为true)执行此常规子表达式,否则执行此其他子表达式。

这个条件存在于高级正则表达式引擎中… Perl。
Perl使用最先进的正则表达式引擎。 在版本6及更高版本中,它将成为语言不可或缺的一部分,其中代码和表达无缝混合。

Perl 5.10有这个结构:
(?(条件)是模式|无图案)。

编辑只是一个警告,Perl的位置,每个其他语言都遵循正则表达式。