使用Regex匹配多个模式

本文关键字:模式 Regex 使用 | 更新日期: 2023-09-27 17:49:17

我有3组:时间,日期和pin。我可以用这一行来匹配这两行:

26/06/2012 33:06:12a_user_logged_in, 3412234, 2, 3512年,333:06:12a_user_logged_in, 3412234, 3512, 3, 26/06/201226/06/2012 a_user_logged_in_at 33:06:12, 3412234, 3512, 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}).+ 

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

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

使用Regex匹配多个模式

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

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

如果不想同时验证模式,可以使用从字符串开头开始的查找。因为它们实际上并不消耗任何东西,所以引擎在完成一次前视后会跳转回起点。因此,三个匹配的顺序无关紧要:

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

这些将简单地为您提供所需的值作为整个匹配