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

7
我有三个组:时间,日期和pin。 我可以使用以下行匹配这些行:
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}).+ 

但是当我将这种模式应用到其他两行形式时,它没有匹配成功。

我的问题是,如何匹配时间、日期和 PIN 组,无论行形式如何?


1
这些模式似乎没有交叉匹配,那为什么不按顺序匹配呢?此外,请在“[regex]”问题中指定您使用的语言/工具。 - Lev Levitsky
我已更新了问题,也更新了给定的模式。谢谢。 - Rafael Adel
2个回答

11

只需在表达式之间添加|

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

请注意,这将创建三个匹配项,每个匹配项都有一个非空组。 - Martin Ender
@MartinEnder或user1006989,如果你还在这里,你能告诉我如果我使用MatchCollection如何将它们分开吗? - abdul qayyum

6
如果您不想同时验证模式,可以从字符串开头使用前瞻。由于它们实际上并不消耗任何内容,引擎在完成一个前瞻后会跳回到开始位置。因此,三个匹配项的顺序无关紧要。
^(?=.*(?<date>\d+/\d+/\d+))(?=.*(?<time>\d+:\d+:\d+))(?=.*,(?<pin>\d{4,10}))

请注意pin组之前的,。否则,您有可能会将年份识别为pin(因为它也是4位数)。
但是,出于代码可读性的考虑,您可能想将其拆分为三个模式(这也避免了捕获,因此可能不会慢太多)。
Pattern for date: \d+/\d+/\d+
Pattern for time: \d+:\d+:\d+
Pattern for pin:  (?<=,)\d{4,10}

这将直接以整个匹配方式提供所需的值。


提供的lookahead链接相当复杂。你能给我提供一个更简单的链接吗?或者可以向我解释一下lookahead是如何工作的吗?谢谢。 - Rafael Adel
基本上,当输入一个前瞻时,引擎会记住当前位置。然后它继续像往常一样尝试找到匹配项(即它将尝试匹配^.*(?<date>\d+/\d+/\d+))。一旦完成了这个操作,它就会跳回到进入前瞻的位置(在这种情况下是字符串的开头)。这就是全部内容(因为我们只在这里使用正向前瞻)。 - Martin Ender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接