PHP擴展之文本處理(二)——PCRE正則表達式語法5——錨和句點
在一個字符類外面,在默認匹配模式下,?^?是一個斷言當前匹配點位于目標字符串開始處的斷言。在一個字符類內部,?^?表明這個字符類中描述的字符取反(詳見下文)。
^?并不一定要是模式的第一個字符, 但是如果處于某個可選分支時, 它應該是該分支的首字符。如果所有選擇分支都以?^?開頭,這就是說, 如果模式限制為只匹配目標的開頭, 它被稱為是一個 ”緊固” 模式。(同樣也有其他方式可以構造出緊固模式)
$?是用于斷言當前匹配點位于目標字符串末尾, 或當目標字符串以換行符結尾時當前匹配點位于該換行符位置(默認情況)。?$?不一定要作為模式的最后一個字符,但是如果它在某個可選分支中時, 就應該位于該分支的末尾。?$?在字符類中沒有特殊的意義。
$?的意義可以通過在編譯或匹配時設置?PCRE_DOLLAR_ENDONLY?改變為只匹配字符串末尾。 這不會影響 Z 斷言的行為。
^?和?$?字符的意義在?PCRE_MULTILINE?選項被設置時會發生變化。 當在這種情況下時, 它們匹配每一個換行符后面的和前面的字符,另外, 也會匹配目標字符串的開始和結束。比如, 模式 /^abc$/ 在多行模式下會成功匹配目標字符串 ”defnabc”, 而正常情況下不會。因此,由于所有的可選分支都以 ^ 開始, 在單行模式下這成為緊固模式,然而在多行模式下,這是非緊固的。?PCRE_DOLLAR_ENDONLY?選項在PCRE_MULTILINE?設置后失效。
注意: A、Z、 z 等轉義序列可以在任何模式下用于匹配目標字符串的開始和結束位置。 并且如果模式的所有分支都以 A 開始,它同樣是緊固的, 而與?PCRE_MULTILINE?是否設置無關。
句點在字符類外部,模式中的句點匹配目標字符串中的任意字符,包括非打印字符, 但是(默認)不包括換行符。如果?PCRE_DOTALL?被設置,句點就會匹配換行符。 句點的處理和^、$的處理沒有關聯,它們唯一的關系是它們都涉及到了換行符。 句點在字符類中沒有任何意義。
C可以被用于匹配單字節, 也就是說在UTF-8模式下,句點可以匹配多字節字符。
相關文章: