正则表达式:为什么我在这里得到比赛?

时间:2011-12-02 00:49:53

标签: php regex

我有一个正则表达式,它正在寻找2-3个大写字母,一起以T结尾,以P,M,C或E开头。在PHP中执行的正则表达式如下所示:

<?php

# The string to match against
$DT = 'Sat, 26 Nov 2011 21:04:19 GMT';

# Returns "MT" as a match
preg_match('/[PMCE][A-Z]?T/', $DT, $matches);

# I've also tried this -- returns "M" as a match
preg_match('/P|M|C|E[A-Z]?T/', $DT, $matches);

使用?将第二个字符标记为可选,但不应该只能返回PT,MT,CT,ET或P * T,M * T,C * T,E * T'

这个正则表达式不应该匹配上面的字符串,我想?我实际上已经使用过非正则表达式方法,但我想知道我做错了什么。 “MT”是否可能与这些表达式中的任何一个匹配?

在英语中,我认为两者都是“字符P,M,C或E可能后跟任何A-Z字符,后跟T。

3 个答案:

答案 0 :(得分:2)

preg_match('/[PMCE][A-Z]?T/', $DT, $matches);


preg_match('/P|M|C|E[A-Z]?T/', $DT, $matches);

这两个都与GMT相匹配。如果你想让它成为自己的单词,那就让它匹配一个空格,如下所示:

preg_match('/ [PMCE][A-Z]?T/', $DT, $matches);

答案 1 :(得分:2)

P|M|C|E[A-Z]?T表达式转换为P M C 或< / em> E[A-Z]?T,这就是为什么它很高兴匹配单个“M”。

如果您希望第二个正则表达式更像第一个,那么您需要对 -ed字符进行分组:(P|M|C|E)[A-Z]?T应该这样做,但我更喜欢您的原始版本反正。

答案 2 :(得分:2)

  

第二个字符被标记为可选的?但它不应该只能返回PT,MT,CT,ET或P * T,M * T,C * T,E * T?

当然,但它正在返回MT,就像你说的那样,它可能是匹配的。我认为您的问题是您不希望preg_match从时区标识符的中间开始匹配尝试。但在这种情况下,你必须指定:

preg_match('/\b[PMCE][A-Z]?T/', $DT, $matches);

\b匹配字边界。