Php 正则表达式:为什么我在这里得到匹配,而我期望没有?

Php 正则表达式:为什么我在这里得到匹配,而我期望没有?,php,regex,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

我有一个正则表达式,它寻找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);
preg_match('/ [PMCE][A-Z]?T/', $DT, $matches);

这两个单词都与GMT匹配。如果希望它是自己的单词,请将其与空格匹配,如下所示:

<?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);
preg_match('/ [PMCE][A-Z]?T/', $DT, $matches);
这两个单词都与GMT匹配。如果希望它是自己的单词,请将其与空格匹配,如下所示:

<?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);
preg_match('/ [PMCE][A-Z]?T/', $DT, $matches);

p | M | C | E[A-Z]?T
表达式翻译成类似于
p
M
C
E[A-Z]?T
,这就是为什么它很乐意匹配单个“M”


如果你想让你的第二个正则表达式表现得更像第一个正则表达式,那么你就需要对它们进行分组:
(p | M | C | E)[A-Z]?T
应该这样做,但我还是更喜欢你的原始版本。

p | M | C | E[A-Z]?T
表达式翻译成类似于
p
M
E[A-Z]?T
,这就是为什么它很高兴匹配单个“M”

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

第二个字符用?但它不应该只返回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
匹配单词边界

第二个字符用?但它不应该只返回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
匹配单词边界。

是的,它匹配我在第一个空格中想要的M——你说得对。但是,由于字符串可以以时区开头(不要问),我可以使用\b作为单词边界,这将起作用。是的,它与我在第一个空格中想要的M匹配——你是对的。但是,由于字符串可以以时区(不问)开头,我可以使用\b作为单词边界,这将起作用。除此之外,它可能与“MT”不匹配,原因相同——“t”仅在第一个字母为“E”时匹配。此外,它可能与“MT”不匹配,原因相同——“t”仅在第一个字母为“E”时匹配“E”。