字元表示、字元類
June 29, 2022字母和數字在規則表示式中,都是按照字面意義比對,有些字元之前加上了 \
之後,會被當作詮譯字元。
字元表示
例如 \t
代表按下 Tab 鍵的字元,底下列出規則表示式的字元表示:
- 字母或數字:比對字母或數字
\\
:比對\
字元\xhh
:16 進位 0xhh 字元\uhhhh
:BMP 範圍內的碼點\n
:換行(\u000A)\v
:垂直定位(\u000B)\f
:換頁(\u000C)\r
:返回(\u000D)\a
:響鈴(\u0007)\b
:退格(\u0008)\t
:Tab(\u0009)
在大部份主流語言中,上頭的表示法應該都可以運作,不過,還是得注意支援上的差異性,各語言中通常還會有不同的表示法。
例如,在八進位碼的表示上,Python、JavaScript 是以 \num
表示,而 Java 則是 \0num
;對於 BMP 外的字元,從 Python 3.3 以後有 \Uhhhhhhhh
的表示法,Java、JavaScript 可以使用代理對(Surrogate pair) '\uD834\uDD1E'
,或者 Java 可使用 \x{h...h}
的表示,ES6 之後支援 \u{1D11E}
。
詮譯字元在規則表示式中有特殊意義,例如 $
^
*
(
)
+
=
{
}
[
]
|
\
:
.
?
等,若要比對這些字元,則必須加上轉義(Escape)符號,例如要比對 $
字元,必須使用 \$
。
如果不確定哪些標點符號字元要加上轉義符號,可以在每個標點符號前加上\
,例如比對逗號也可以寫 \,
。
字元類
如果規則表示式為 XY
,那麼表示比對「X 之後要跟隨著 Y」,如果想表示「X 或 Y」,可以使用 X|Y
,如果有多個字元要以「或」的方式表示,例如「X 或 Y 或 Z」,可以使用字元類(Character class)表示為 [XYZ]
。
規則表示式中,多個字元可以歸類在一起,成為一個字元類,字元類會比對文字中是否有「任一個」字元符合字元類中某個字元。規則表示式中被放在 []
中的字元就成為一個字元類。例如,若字串為 Justin1Monica2Irene3Bush,你想要找到 1
或 2
或 3
來切割字串,規則表示式可撰寫為 [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]
除了這些基本通用的類別之外,有些語言還支援更多不同的特性,例如 POSIX 字元類,在 Java、Go 中有支援。