正则表达式:没有嵌套组的可选但依赖匹配的序列

时间:2016-07-12 08:51:04

标签: regex

我正在编写一个正则表达式来匹配MySQL在分配给DATETIME列时接受的字符串。

正则表达式需要匹配这些字符串:

2016-07-12 06:32:.0001
2016-07-12 06::54.0001
2016-07-12 :32:54.0001
2016-07-12 ::.

但不应该匹配这些字符串:

/^
(\d+) # year
[[:punct:]]
(\d+) # month
[[:punct:]]
(\d+) # day
(?:
    (?:T|\s+|[[:punct:]]) # seperator between date and time
    (?:
        (\d+) # hour
        (?:
            [[:punct:]]
            (?:
                (\d+) # minute
                (?:
                    [[:punct:]]
                    (?:
                        (\d+) # second
                        (?:
                            \.
                            (\d+)? # microsecond
                        )?
                    )?
                )?
            )?
        )?
    )?
)?
$/xDs

也就是说,中间空间之后的所有部分都是可选的,每个可选部分都取决于前一部分(正则表达式只能跳过剩余的部分直接结束)。 / p>

目前我有:

AREAS

有没有办法避免深层嵌套的群组?

由于

1 个答案:

答案 0 :(得分:1)

您的问题的答案 - 如果您想在结果中保留捕获的值 - 是

为什么呢? Capturing repeated groups is not supported in PCRE。此外,如果您使用任何类型的(?:(PATTERN_BLOCK)PATTERN_BLOCK2){n},您将获得最终的PATTERN_BLOCK值。如果您考虑(?(DEFINE)....)capturing groups inside that block are also reset以后就无法访问这些值。

这些带有“嵌套”捕获组的可选组正是您在这种情况下所需要的。