與 perl 的不同之處

這里討論的不同之處是與 perl 5.005相比的。

  1. 盡管可以使用字符類編譯 pcre 進行替代,但仍然默認使用 c 庫函數(shù) isspace() 判定一個字符是否是空白字符。通常 isspace() 匹配空格、換頁符、換行符、 回車符、水平制表符和垂直制表符。 Perl5 不再將垂直制表符包括到空白字符集中。 \v 這個轉(zhuǎn)義實際上在很長時間都沒有得到 perl 文檔的承認。然而,這個字符自身 被認為是一個空白字符至少是在 5.002 以上。 在 5.004 和 5.005 它不和 \s 匹配。
  2. PCRE 不允許前瞻斷言的量詞修飾,perl 允許這樣做,但是這并不是你想象的那樣。 例如,(?!a){3}并不意味著接下來 3 個字符不是 a,而是斷言下一個字符不是 a 并進行了 3 次斷言.
  3. 捕獲子組發(fā)生在消極前瞻斷言中時被計算在內(nèi),但是在偏移向量中并沒有設置它們的條目。 Perl 從斷言失敗之前匹配得到的這些模式匹配結(jié)果中設置了它的數(shù)值變量(因此是成功的), 但這也僅在消極前瞻斷言只有一個分支的時候。
  4. 盡管目標字符串中支持二進制 0 字符,但是它們在模式字符串中是不允許的,因為它們是通過普通的 c 字符串傳遞的,而 c 字符串是以 0 字符結(jié)束的。轉(zhuǎn)義序列"\x00"可以在模式中表示二進制 0 字符。
  5. 不支持下面的 perl 轉(zhuǎn)義序列:\l、\u、 \L、 \U。 實際上這些都是通過 perl 一般的字符串處理來實現(xiàn) 的,而不是模式匹配引擎的一部分。
  6. 不支持 perl 的 \G 斷言,因為它與單模式匹配沒有關系。
  7. 很顯然,PCRE不支持(?{code}) 和 (??{code})的結(jié)構(gòu),但是它支持遞歸模式。
  8. 在 perl 5.005_2 中檔設置為捕獲字符串的模式中有部分重復的時候會有一些古怪的現(xiàn)象發(fā)生, 比如: /^(a(b)?)+$/ 捕獲 aba 的時候, $2 會被設置為 b,然而,如果把模式修改為/^(aa(bb)?)+$/, 用aabbaa去匹配,$2講不會得到匹配結(jié)果。 如果將模式修改為 /^(aa(b(b))?)+$/, $2 和 $3 又都能 得到匹配結(jié)果。在 perl 5.004 中 $2 在這幾種情況下都能夠得到匹配結(jié)果,并且 pcre 也是這樣。如果 未來 perl 修改為一致那就不同了。pcre 可能接下來會修改.
  9. 還有一個沒有解決的差異是 perl 5.005_02中,模式 /^(a)?(?(1)a|b)+$/ 會匹配字符串 "a", 而 pcre 中不會,然而,perl 和 pcre 中 /^(a)?a/ 匹配 "a" 都會得到相同的結(jié)果,$1 都未被設置。
  10. PCRE 提供了一些對 perl 正則表達式的擴展:

    1. 雖然后瞻斷言要求必須匹配固定長度的字符串,然而后瞻斷言的每個可選分支 還是可以使用不同長度的字符串的,而perl 5.005 中要求它們必須擁有同樣 的長度。
    2. 如果設置了 PCRE_DOLLAR_ENDONLY 并且沒有設置 PCRE_MULTILINE, 元字符 $ 僅僅匹配字符串的末尾(而不是某個換行符之前)。
    3. 如果設置了 PCRE_EXTRA, 反斜線后緊跟一個沒有特殊含義的字符講會導致錯誤。
    4. 如果設置了 PCRE_UNGREEDY, 貪婪量詞修飾被逆轉(zhuǎn),也就是說,默認它們都是非貪婪的了,但如果緊跟一個問號它們就會變成 貪婪的。(譯注:既完全將貪婪模式逆轉(zhuǎn)。)