與 perl 的不同之處

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

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

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