如何在Ruby中使正则表达式的一部分可选?

时间:2011-03-09 00:02:39

标签: ruby regex

要匹配以下内容:

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在可选?所以,如果它很好,如果没有,它仍然匹配?

4 个答案:

答案 0 :(得分:14)

不确定。把它放在括号中,在它后面加一个问号。包含其中一个空格(否则,如果缺少“at”,您将尝试匹配两个空格。)(at )?(或其他人建议,(?:at )?以避免被捕获)。

答案 1 :(得分:12)

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

(?:at)?

答案 2 :(得分:2)

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

   (at )*

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

   (at )?

答案 3 :(得分:2)

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

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

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

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

Perl 5.10有这样的结构:
(?(条件)是图案|无图案)。

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