复合字符串匹配

时间:2016-01-02 22:28:23

标签: regex

假设我有这些字符串(每行是一个单独的字符串):

5207
002
LEC
WF 9:30AM - 10:20AM
RCH   302
Firas Mansour
01/04/2016 - 04/04/2016

我正在尝试创建一个与WF 9:30AM - 10:20AM行匹配的正则表达式。我无法确定在正则表达式中将其他字符串从其他字符串中分离出来的确切含义。该行的格式可能会有所不同:

  • 调用WF部分A部分.A部分可以包含'M','T','W','Th','F'或任何连接组合。在这个例子中,A部分是W和F.

  • B部分是第一次。这可以是示例中的12h,或者像这样的24h:M 19:00 - 20:50

  • 之后是连字符,第二次采用与第一次相同的格式。

我不太确定如何解决这个问题,任何帮助都会很棒!如果正则表达式只匹配该行而不匹配其他行,则它可以正常工作。

2 个答案:

答案 0 :(得分:3)

看起来你应该把每个部分一个接一个地放在一起:

^([MTWF]|Th)+ \d\d:\d\d([AP]M)? - \d\d:\d\d([AP]M)?$

 |----------| |---------------|   |---------------|
 ^                           ^      ^
 |                           |      part 3: same as part 2
 part 1: match one of these: |
 - "M", "T", "W", or "F"     |
 - "Th"                      |
                             part 2: match two digits, followed by a colon,
                                     followed by another two digits, then
                                     possible either "A" or "P" followed by
                                     "M"

开头的“^”和结尾的“$”是为了确保该行没有任何其他文字。

如果您只关心匹配有效时间(而不是小时的任何两位数字),您可以做更好的事情,比如:

((1?\d|2[0-3]):[0-5]\d|(1[0-2]|\d):[0-5]\d[AP]M)

答案 1 :(得分:3)

如何将这些部件一个接一个地链接起来:

(?:[MTWF]|(?:Th))*\s\d+:\d\d(?:[AP]M)*\s-\s\d+:\d\d(?:[AP]M)*

Regular expression visualization

查看demo