2016-04-12 36 views
0
Exercise 12: Matching Nested Groups 
Task Text Capture Groups 
Capture Jan 1987 Jan 1987 1987 Failed 
Capture May 1969 May 1969 1969 Failed 
Capture Aug 2011 Aug 2011 2011 Failed 

我找到了解决办法((...)\s\d{1,4})|(\d{1,4})但它不接受正则表达式捕捉到1987年一月,以及1987年

+1

请给出一个downvoting的原因 –

+0

这些问题没有任何意义 - 阅读regexone的解释,在[regex101.com](http://regex101.com)尝试你的模式,*搜索Web *获取更多细节网站是regular-expressions.info和rexegg.com,但还有更多)。 –

回答

2

尝试:

([A-Za-z]+\s)?\d{1,4} 

将在号码前选择一个可选字

但是,在RegexOne上观看练习后,要捕捉完成任务所需的内容,请使用:

((?:[A-Za-z]+\s)?(\d{1,4})) 

你做错了什么。

((...)\s\d{1,4})|(\d{1,4}) 

你需要收集年度以及每月名称,所以你应该使用如下:

(...\s(\d{1,4}))|(\d{1,4}) 

添加()各地\d{1,4}捕捉到它(你可以删除()围绕...,因为月份名称,例如Jan不需要被捕获)。你正则表达式被捕获或者:

  • Jan 1999Jan
  • 1999

现在将捕获:

  • Jan 19991999
  • OR
  • 1999
+0

我认为这个词和数字之间有一个空格。 – Shafizadeh

+0

@Shafizadeh新增,谢谢! ';)' – Druzion

+0

它不接受这种情况是它只接受19XX,但不是1987年1月 –

2

原始交

\b((\w{3})?\s\d{4})\b 

正则表达式匹配RegexOne图案

((\w{3})?[\s\b](\d{4})) 

忘记的基团。

匹配Mon YEARYEAR

+0

它并不能解决问题亲爱的。感谢您的帮助,但它只接受第一部分 –

+0

++限制月份名称为3个字符。但是,为什么你在你的模式中使用'\ b'? – Shafizadeh

+1

@SachinDivakar编辑正则表达式作品,最初缺少的组,请参阅http://i.imgur.com/bme6kE2.png –

1

RegexOne一个工作的解决办法是:

((Jan|May|Aug)\s(1987|1969|2011)) 

您需要正确阅读文本,任务是既捕捉还有全日
作为@Druzion指出,正则表达式仍然可以优化的,就像这样:

((?:Jan|May|Aug)\s(\d{4})) 

这捕获整个日期,使用非捕获组当月部分和今年分别捕获。

+0

这三个月份的'Jan','May','Agu'只是一个例子。我想也有其他几个月的名字。 – Shafizadeh

+0

@Druzion:没错,但练习是关于括号。 – Jan

+0

@Shafizadeh:不,这些例子是直接从网站上获取的。 – Jan