字符類(方括號)

左方括號開始一個字符類的描述,并以方中括號結(jié)束。 單獨的一個右方括號沒有特殊含義。如果一個右方括號需要作為一個字符類中的成員, 那么可以將它寫在字符類的首字符處(如果使用了 ^ 取反, 那么是第二個)或者使用轉(zhuǎn)義符。

一個字符類在目標字符串中匹配一個單獨的字符; 該字符必須是字符類中定義的字符集合的其中一個, 除非使用了 ^ 對字符類取反。 如果^需要作為一個字符類的成員,確保它不是該字符類的首字符, 或者對其進行轉(zhuǎn)義即可。

例如,字符類[aeiou]匹配所有的小寫元音字母, 而[^aeiou]匹配所有非元音字母的字符。注意: ^只是一個通過枚舉指定那些不存在字符類之中的字符的便利符號。而不是斷言, 它仍然會從目標字符串中消耗一個字符,并且如果當前匹配點在目標字符串末尾, 匹配將會失敗。

當大小寫無關(guān)匹配被設(shè)置后,任意字符類都同時代表大小寫兩種版本,因此對于例子, 一個大小寫不敏感的[aeiou]同時匹配"A"和"a", 并且大小寫不敏感的[^aeiou]同時不匹配 "A"。

換行符在字符類中沒有任何特殊涵義, 與 PCRE_DOTALLPCRE_MULTILINE 選項都無關(guān)。 例如 [^a] 這樣的字符類始終會匹配換行符。

在字符類中,一個中劃線(減號 -)可以用于指定從一個字符到另一個字符的范圍。 比如,[d-m]匹配d到m之間的所有字符,這個集合時閉合的。 如果中劃線自身要在一個字符類中描述, 它必須被轉(zhuǎn)移或者出現(xiàn)在一個不會被解釋為一個范圍的位置, 典型的比如字符類開始或結(jié)束位置。

在一個字符范圍描述后面不能使用右中括號。 比如一個模式 [W-]46] 被解釋為一個包含 W 和 - 的字符類,后面緊跟字符串 ”46]”, 因此它可以匹配 ”W46]” 或 ”-46]”。然而, 如果中括號是經(jīng)過轉(zhuǎn)義的, 它將會被解釋為范圍的終點, 因此 [W-\]46] 就會被解釋為一個單獨的包含 W 至 ] 范圍內(nèi)所有字符以及 4、6 的字符類。 8 進制或 16 進制描述的中括號同樣可以用于作為范圍的終點。

范圍操作以 ASCII 整理排序。它們可以用于為字符指定數(shù)值,比如 [\000-\037]。 如果在大小寫不敏感匹配模式下使用一個包含字母的范圍, 則同時匹配它的大小寫形式。 比如 [W-c] 在不區(qū)分大小寫匹配時等價于 [][\^_`wxyzabc],并且, 如果使用了 ”fr”(法國) 的地域設(shè)置字符表時, [\xc8-xcb] 將會在所有模式下匹配重音 E 字符。

字符類\d、\D、 \s、\S、\w 和 \W 也可以出現(xiàn)在一個字符類中, 用以將其匹配的字符類加入到新的自定義字符類中。比如, [\dABCDEF] 匹配任意合法的 16 進制數(shù)。用 ^ 可以很方便的制定嚴格的字符類, 比如 [^\W_] 匹配任何字母或數(shù)字,但不匹配下劃線。

所有非字母數(shù)字字符除了\、-、 ^(在起始位置)以及結(jié)束的]在字符類中都是非特殊字符, 沒有轉(zhuǎn)義也不會有危害。模式結(jié)束符在表達式中總是特殊字符,必須進行轉(zhuǎn)義。

Perl 支持 POSIX 字符類符號。這種字符類使用[::]閉合。 PCRE 同樣支持這些字符類, 比如,[01[:alpha:]%]匹配 ”0”、“1”、任意字母或”%”。 支持的字符類如下:

字符類
alnum字母和數(shù)字
alpha字母
ascii0 - 127的ascii字符
blank空格和水平制表符
cntrl控制字符
digit十進制數(shù)(same as \d)
graph打印字符, 不包括空格
lower小寫字母
print打印字符,包含空格
punct打印字符, 不包括字母和數(shù)字
space空白字符 (比\s多垂直制表符)
upper大寫字母
word單詞字符(和 \w 一樣)
xdigit十六進制數(shù)字
空白字符有HT(9)、 LF(10)、VT(11)、 FF(12)、CR(13)、space(32)。 注意, 這個列表包含了垂直制表符。這使得space不同于\s, 因為它不包含垂直制表符(為了向 Perl 兼容)

[:word:]是一個 Perl擴展,[:blank:]是一個從 Perl5.8 中來的 GNU 擴展。 另外一個 Perl 擴展是取反,通過前置一個^。 比如, [12[:^digit:]] 匹配”1”, “2” 或任何非數(shù)字字符

在 UTF-8 模式中,大于 128 的字符值不會匹配任何 POSIX 字符類。 自 libpcre 8.10 起,某些字符類改為使用 Unicode 字符屬性,所以不會出現(xiàn)提醒中的限制。 詳情參閱 ? PCRE(3) manual。

Unicode character properties can appear inside a character class. They can not be part of a range. The minus (hyphen) character after a Unicode character class will match literally. Trying to end a range with a Unicode character property will result in a warning.