【问题标题】:Match multiple patterns with a Regex使用正则表达式匹配多个模式
【发布时间】:2012-12-23 23:17:53
【问题描述】:

我有 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}).+ 

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

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

【问题讨论】:

  • 模式似乎没有交叉匹配,那么为什么不按顺序匹配呢?另外,请在[regex]问题中指定您使用的语言/工具。
  • 我已经更新了问题,也更新了给定的模式。谢谢。

标签: c# .net regex


【解决方案1】:

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

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

【讨论】:

  • 请注意,这将创建三个匹配,每个匹配一个非空组。
  • @MartinEnder 或 user1006989,如果你还在这里,你能告诉我,如果我使用 MatchCollection,我以后如何分离它们?
【解决方案2】:

如果不想同时验证模式,可以从字符串开头使用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}

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

【讨论】:

  • 提供的前瞻链接非常值得阅读。你能给我一个更简单的链接吗?或者只是向我解释前瞻是如何工作的?谢谢。
  • @RafaelAdel 基本上,当输入前瞻时,引擎会记住它的当前位置。然后它会像往常一样继续尝试查找匹配项(即它只会尝试匹配^.*(?&lt;date&gt;\d+/\d+/\d+))。一旦完成,它将跳回它进入前瞻的位置(在本例中为字符串的开头)。这就是它的全部内容(因为我们在这里只使用积极的前瞻)。
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多