我有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/2012
与date
组匹配,将33:06:12
与time
匹配,将3412234
与pin
组匹配。
我已经成功完成了这项工作,但只有该行必须采用某种模式,如第一种
(?<date>[\d]+/[\d]+/[\d]+) (?<time>[\d]+:[\d]+:[\d]+)([ |,][a-zA-z]*)+,(?<pin>[\d]{4,10}).+
但是当我将这种模式应用于其他两行形式时,它并不匹配。
我的问题是,无论线形是什么,如何匹配时间,日期和引脚组?
答案 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}
这些只会在整场比赛中为您提供所需的值。