字元、字元類


字母和數字在規則表示式中,都是按照字面意義比對,有些字元之前加上了 \ 之後,會被當作詮譯字元,例如 \t 代表按下 Tab 鍵的字元,底下列出規則表示式的字元表示:

  • 字母或數字:比對字母或數字
  • \\:比對 \ 字元
  • \xnum:ASCII 十六進位碼
  • \uhhhh:Unicode 十六進位碼
  • \n:換行(\u000A)
  • \v:垂直定位(\u000B)
  • \f:換頁(\u000C)
  • \r:返回(\u000D)
  • \a:響鈴(\u0007)
  • \b:退格(\u0008)
  • \t:Tab(\u0009)

在大部份主流語言中,上頭的表示法應該都可以運作,不過,還是得注意支援上的差異性,各語言中通常還會有不同的表示法。

例如 ASCII 八進位碼的表示上,Python、JavaScript 是以 \num 表示,而 Java 則是 \0num;對於 BMP 外的字元,從 Python 3.3 之後有 \Uhhhhhhhh 的表示法,JavaScript 可以使用 '\uD834\uDD1E',或者 ES6 之後支援 \u{1D11E},Java 則使用 \x{h...h} 的表示。

詮譯字元在規則表示式中有特殊意義,例如 $ ^ * ( ) + = { } [ ] | \ : . ? 等,若要比對這些字元,則必須加上轉義(Escape)符號,例如要比對 $ 字元,必須使用 \$

如果不確定哪些標點符號字元要加上轉義符號,可以在每個標點符號前加上\,例如比對逗號也可以寫 \,

如果規則表示式為 XY,那麼表示比對「X 之後要跟隨著 Y」,如果想表示「X 或 Y」,可以使用 X|Y,如果有多個字元要以「或」的方式表示,例如「X 或 Y 或 Z」,可以使用字元類(Character class)表示為 [XYZ]

規則表示式中,多個字元可以歸類在一起,成為一個字元類,字元類會比對文字中是否有「任一個」字元符合字元類中某個字元。規則表示式中被放在 [] 中的字元就成為一個字元類。例如,若字串為 Justin1Monica2Irene3Bush,你想要找到 123 來切割字串,規則表示式可撰寫為 [123]

規則表示式 123 連續出現字元 1、2、3,然而 [] 中的字元是「或」的概念,也就是 [123] 表示「1 或 2 或 3」,| 在字元類別只是個普通字元,不會被當作「或」來表示。

字元類中可以使用連字號 - 作為字元類詮譯字元,表示一段文字範圍,例如要比對文字中是否有 1 到 5 任一數字出現,規則表示式為 [1-5],要比對文字中是否有 a 到 z 任一字母出現,規則表示式為 [a-z],要比對文字中是否有 1 到 5、a 到 z、M 到 W 任一字元出現,規則表示式可以寫為 [1-5a-zM-W]

如果是 \num\xnum\uhhhh 等表示法,也可以使用 -,例如 [\u4e00-\u9fff] 常用來判斷中文的範圍。

字元類中可以使用 ^ 作為字元類詮譯字元,[^] 則為反字元類(Negated character class),例如 [^abc] 會比對 a、b、c 以外的字元。

以下為字元類的幾個表示範例:

  • [abc]:a 或 b 或 c 任一字元
  • [^abc]:a、b、c 以外的任一字元
  • [a-zA-Z]:a 到 z 或 A 到 Z 任一字元
  • [a-d[m-p]]: a 到 d 或 m 到 p 任一字元(聯集),等於 [a-dm-p]
  • [a-z&&[def]]:a 到 z 且是 d、e、f 的任一字元(交集),等於 [def]
  • [a-z&&[^bc]]:a 到 z 且不是 b 或 c 的任一字元(減集),等於 [ad-z]
  • [a-z&&[^m-p]]:a 到 z 且不是 m 到 p 的任一字元,等於 [a-lq-z]

可以看到,字元類中可以再有字元類,把規則表示式想成是語言的話,字元類就像是其中獨立的子語言。

有些字元類很常用,例如經常會比對是否為 0 到 9 的數字,可以撰寫為 [0-9],或是撰寫為 \d,這類字元被稱為字元類縮寫或預定義字元類(Predefined character class),它們不用被包括在 [] 之中,底下列出可用的預定義字元類:

  • .:任一字元(不包括換行、多位元組字元)
  • \d:比對任一數字字元,即 [0-9]
  • \D:比對任一非數字字元,即 [^0-9]
  • \s:比對任一空白字元,即 [\t\n\x0B\f\r]
  • \S:比對任一非空白字元,即 [^\s]
  • \w:比對任一 ASCII 字元,即 [a-zA-Z0-9_]
  • \W:比對任一非 ASCII 字元,即 [^\w]

除了這些基本通用的類別之外,有些語言還支援更多不同的特性,例如,Java 支援 POSIX 字元類、java.lang.Character 類等,可以在 java.util.regex.Pattern 的 API 文件上查找到相關說明。