使用正则表达式匹配多个模式

时间:2012-12-23 23:17:53

标签: c# .net regex

我有3组:时间,日期和别针。我可以让这一行符合这一行:

  

26/06/2012 33:06:12a_user_logged_in,3412234,2,3,512,3   33:06:12a_user_logged_in,3412234,2,3,512,3,26 / 06/2012   26/06/2012 a_user_logged_in_at,33:06:12,3412234,2,3,512,3

我想将26/06/2012date组匹配,将33:06:12time匹配,将3412234pin组匹配。

我已经成功完成了这项工作,但只有该行必须采用某种模式,如第一种

(?<date>[\d]+/[\d]+/[\d]+) (?<time>[\d]+:[\d]+:[\d]+)([ |,][a-zA-z]*)+,(?<pin>[\d]{4,10}).+ 

但是当我将这种模式应用于其他两行形式时,它并不匹配。

我的问题是,无论线形是什么,如何匹配时间,日期和引脚组?

2 个答案:

答案 0 :(得分:9)

只需在表达式之间添加|

(?<date>[\d]+/[\d]+/[\d]+)|(?<time>[\d]+:[\d]+:[\d]+)|(?<pin>(?<=[^/])[\d]{4,10})

答案 1 :(得分:4)

如果您不想同时验证模式,可以从字符串的开头使用lookaheads。由于它们实际上并没有消耗任何东西,因此在完成一个前瞻后引擎会跳回到开始状态。因此,三场比赛的顺序并不重要:

^(?=.*(?<date>\d+/\d+/\d+))(?=.*(?<time>\d+:\d+:\d+))(?=.*,(?<pin>\d{4,10}))

请注意,组前面的pin。否则,您可能会发现年份是针脚(因为它也是4位数字)。

但话又说回来,为了您的代码的可读性,您可能希望将其分成三种模式(这也避免了捕获,因此它甚至可能不会那么慢):

Pattern for date: \d+/\d+/\d+
Pattern for time: \d+:\d+:\d+
Pattern for pin:  (?<=,)\d{4,10}

这些只会在整场比赛中为您提供所需的值。