6

我有 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作为time3412234作为pin组。

我已经成功地这样做了,但只有这条线必须像第一条那样采用某种模式

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

但是当我将此模式应用于其他两行表格时,它不匹配。

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

4

2 回答 2

10

只需|在您的表达式之间添加:

(?<date>[\d]+/[\d]+/[\d]+)|(?<time>[\d]+:[\d]+:[\d]+)|(?<pin>(?<=[^/])[\d]{4,10})
于 2012-12-23T23:40:29.973 回答
5

如果您不想同时验证模式,则可以使用从字符串开头开始的前瞻。由于它们实际上不消耗任何东西,因此引擎在完成一次前瞻后跳回开始。因此,三场比赛的顺序无关紧要:

^(?=.*(?<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}

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

于 2012-12-23T23:24:42.707 回答