2015-02-09 67 views
-2

我试图找到日期的组合。我有以下正则表达式。限制发生的次数正则表达式

\b([\d]{1,2}[\/\s-]{0,3}\d{2,4}) 

我想匹配以下组合:

8/1967 or 8-1967 
08/1967 same 
8/67 same 
08/67 same 

我不希望它匹配以下

08/967 

这是我想后 “/” 或“组合 - “可以是2位数字或4位数字。 但“\ d {2,4}”会给出组合,如果2,3和4,但我不知道如何限制它为2或4.如果此正则表达式有任何其他问题,请让我知道。请帮助。

+0

还有额外的'\ s'匹配空格,对于'02 2004',它是故意的吗? – 2015-02-09 07:08:10

+0

你想匹配'8 /// 23'吗?发布一些有效和无效的示例。 – 2015-02-09 07:23:43

+0

你的正则表达式匹配99999,9999,9999999和99-999,+ 2部分+ 1-555-“123456” – 2015-02-09 07:29:16

回答

3

如果您匹配几个月甚至几年,做

\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b 

说明:

  • \b - 非字母数字和字母数字字符之间的字边界
  • (?:0?[1-9]|1[0-2]) - 1-12和01 -12(带前导零)
  • ? - 分隔器两侧的可能空间
  • [-/] 1个分隔字符,要么 - 或/
  • (?:[12][0-9])?[0-9]{2}) - 要么是以1或2开头的4位数字,要么是带有任何数字的2位数字。
  • \b - 以文字边界结尾(下一个字符不是字母数字)。

这将匹配下列字符串:03-190212/20146/03

,但不会匹配任何3/300913/2009,或26-30,或3///60,或12/34567

我使用[0-9]而不是\d,因为\d是区域设置相关的。

DEMO


要匹配的日期范围(?你可能做了CV /简历解析器在这里),你可以这样做:

date_re = r'\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b' 
date_span = r'%s(?:[\s-]+)-\s*%s' % (date_re, date_re) 

产生在date_span以下正则表达式:

\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b(?:[\s-]+)-\s*\b((?:0?[1-9]|1[0-2]) ?[/-] ?(?:[12][0-9])?[0-9]{2})\b 

DEMO

+0

@Antii Haapala - 是的。实际上,这是我尝试做的整个比赛的一部分。我将编辑更多细节的问题。你的回答是正确的。但我需要更复杂的一个。我会放在这里。 – user3116355 2015-02-09 08:52:14

+1

请不要,这里的所有答案都是针对1个问题,我不喜欢射击到移动目标。 – 2015-02-09 09:18:07

+0

好的。然后我会发布一个新问题。 – user3116355 2015-02-09 09:21:48

2

变化\d{2,4}\d{2}(\d{2})?

这会得到你想要的东西。

首先匹配2个数字,然后两个数字组合只有一次或没有。

这正是2或4位数字。

+0

@AnttiHaapala谢谢!我的答案已更新。 (?:0?\ d | 1 [0-2])'这部分匹配00或单个0,也许'(?:[1-9] | 0 [1-9] | 1 [0-2])'更好。(我不能评论别人的回答...) – Lution 2015-02-09 07:36:53