簡體   English   中英

正則表達式:當我什么都沒期待時,為什么會在這里得到比賽?

[英]Regular Expression: Why am I getting matches here when I expect none?

我有一個正則表達式,要一起查找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可能后跟任意AZ字符,后跟T。

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


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

兩者都符合格林尼治標准時間。 如果要使其成為自己的單詞,請使其與空格匹配,如下所示:

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

P|M|C|E[AZ]?T表達轉化為像P M C E[AZ]?T這就是為什么它是很樂意配合單一的“M”。

如果您希望第二個正則表達式的行為更像第一個正則表達式,則需要對or字符進行分組: (P|M|C|E)[AZ]?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匹配單詞邊界。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM