我有一个正则表达式,它正在寻找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。
答案 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
匹配字边界。