規則運算式語法

「規則運算式」(Regular Expression) 描述搜尋文字本文時所要比對的一個或多個字串。 這種運算式可以做為範本,用來比對字元模式與所要搜尋的字串。

規則運算式是由一般字元 (例如字母 a 到 z) 與稱為「中繼字元」(Metacharacter) 的特殊字元所組成。

特殊字元

下表包含單一字元之中繼字元的完整清單,以及這類中繼字元在規則運算式中的行為。

注意事項注意事項

若要比對下列其中一個特殊字元,您必須先「逸出」(Escape) 字元,亦即在字元前面加上反斜線字元 (\)。 例如,若要搜尋 "+" 常值字元,您可以使用 "\+" 運算式。

中繼字元

行為

範例

*

比對前置字元或子運算式零次或多次。

相當於 {0,}。

zo* 會比對 "z" 和 "zoo"。

+

比對前置字元或子運算式一次或多次。

相當於 {1,}。

zo+ 會比對 "zo" 和 "zoo",但不會比對 "z"。

?

比對前置字元或子運算式零次或多次。

相當於 {0,1}。

當 ? 緊接著其他任何數量詞 (*, +, ?, {n}、{n,} 或 {n,m}) 時,比對模式為「非窮盡」(Non-Greedy)。 非窮盡模式對於搜尋到的字串,會比對其中最小的部分, 而預設的窮盡模式對於搜尋到字串,則會比對其中最大的部分。

zo? 會比對 "z" 和 "zo",但不會比對 "zoo"。

o+? 會比對 "oooo" 中的單一 "o",而 o+ 會比對所有的 "o"。

do(es)? 會比對 "do" 或 "does" 中的 "do"。

^

比對位於搜尋到之字串開頭的位置。 如果旗標中包含 m (多行搜尋) 字元,^ 也會比對位於 \n 或 \r 之後的位置。

當做方括號運算式中第一個字元的 ^ 會否定字元集。

^\d{3} 會比對位於搜尋到之字串開頭的 3 位數字。

[^abc] 會比對 a、b 和 c 以外的任何字元。

$

比對位於搜尋到之字串結尾的位置。 如果旗標中包含 m (多行搜尋) 字元,^ 也會比對位於 \n 或 \r 之前的位置。

\d{3}$ 會比對位於搜尋到之字串結尾的 3 位數字。

.

比對新行字元 \n 以外的任何單一字元。 若要比對包含 \n 的任何字元,請使用類似 [\s\S] 的模式。

a.c 會比對 "abc"、"a1c" 和 "a-c"。

[]

標記方括號運算式的開頭和結尾。

[1-4] 會比對 "1"、"2"、"3" 或 "4"。 [^aAeEiIoOuU]會比對任何非母音字元。

{}

標記數量詞運算式的開頭和結尾。

a{2,3} 會比對 "aa" 和 "aaa"。

()

標記子運算式的開頭和結尾。 子運算式可儲存起來供日後使用。

A(\d) 會比對 "A0" 到 "A9"。 數字會儲存起來供日後使用。

|

表示兩個以上項目之間的選擇。

z|food 會比對 "z" 或 "food"。 (z|f)ood 會比對 "zood" 或 "food"。

/

代表 JScript 中常值規則運算式模式的開始或結尾。 在第二個 "/" 後面,可以加上單一字元旗標來指定搜尋行為。

/abc/gi 是會比對 "abc" 的 JScript 常值規則運算式。 g (全域) 旗標可用來指定要尋找符合模式的所有項目,而 i (忽略大小寫) 旗標則可讓搜尋區分大小寫。

\

將下一個字元標記為特殊字元、常值、反向參考或八進位逸出。

\n 會比對新行字元。 \( 會比對 "("。 \\ 會比對 "\"。

當特殊字元出現在方括號運算式內部時,大部分的特殊字元會失去原義,而代表一般字元。 如需詳細資訊,請參閱比對字元清單中的<方括號運算式中的字元>。

中繼字元

下表包含多字元之中繼字元的完整清單,以及這類中繼字元在規則運算式中的行為。

中繼字元

行為

範例

\b

比對字緣,即介於文字與空格之間的位置。

er\b 會比對 "never" 中的 "er",但不會比對 "verb" 中的 "er"。

\B

比對非字緣。

er\B 會比對 "verb" 中的 "er",但不會比對 "never" 中的 "er"。

\d

比對數字字元。

相當於 [0-9]。

在搜尋到的字串 "12 345" 中,\d{2} 會比對 "12" 和 "34"。 \d 會比對 "1"、"2"、"3"、"4" 和 "5"。

\D

比對非數字字元。

相當於 [^0-9]。

\D+ 會比對 "abc123 def" 中的 "abc" 和 " def"。

\w

比對下列任何字元:A-Z、a-z、0-9 和底線。

相當於 [A-Za-z0-9_]。

在搜尋到的字串 "The quick brown fox…" 中,\w+ 會比對 "The"、"quick"、"brown" 和 "fox"。

\W

比對 A-Z、a-z、0-9 和底線以外的任何字元。

相當於 [^A-Za-z0-9_]。

在搜尋到的字串 "The quick brown fox…" 中,\W+ 會比對 "…" 和所有的空格。

[xyz]

字元集 (Character Set)。 比對任何一個指定的字元。

[abc] 會比對 "plain" 中的 "a"。

[^xyz]

負字元集。 比對未指定的任何字元。

[^abc] 會比對 "plain" 中的 "p"、"l"、"i" 和 "n"。

[a-z]

字元範圍。 比對指定範圍內的任何字元。

[a-z] 會比對 "a" 到 "z" 範圍內的任何小寫字母字元。

[^a-z]

字元的負值範圍。 比對不在指定範圍內的任何字元。

[^a-z] 會比對不在 "a" 到 "z" 範圍內的任何字元。

{n}

正好比對 n 次。 n 是非負數的整數。

o{2} 不會比對 "Bob" 中的 "o",但會比對 "food" 中的兩個 "o"。

{n,}

至少比對 n 次。 n 是非負數的整數。

* 相當於 {0,}。

+ 相當於 {1,}。

o{2,} 不會比對 "Bob" 中的 "o",但會比對 "foooood" 中所有的 "o"。

{n,m}

至少比對 n 次而且至多比對 m 次。 n 和 m 都是非負值的整數,其中 n <= m。 逗號與數字之間不能有空格。

? 相當於 {0,1}。

在搜尋到的字串"1234567" 中,\d{1,3} 會比對 "123"、"456" 和 "7"。

(pattern)

比對 pattern 並儲存比對。 您可以在 JScript 中,從 exec Method 傳回的陣列元素擷取已儲存的比對。 若要比對括號字元 ( ),請使用 "\(" 或 "\)"。

(Chapter|Section) [1-9] 會比對 "Chapter 5",並儲存 "Chapter" 供日後使用。

(?:pattern)

比對 pattern 但不儲存比對,亦即不會儲存比對以供日後使用。 這個子運算式有助於將模式的一部分與 "or" 字元 (|) 組合在一起。

industr(?:y|ies) 相當於 industry|industries。

(?=pattern)

右合樣 (Positive Lookahead): 在找到相符項目後,下一次就會從符合的文字前面開始比對。 比對不會儲存起來供日後使用。

^(?=.*\d).{4,8}$ 會限制密碼長度必須為 4 到 8 個字元,而且至少必須包含一個數字。

在此模式中,.*\d 會尋找數字後面任何數目的字元。 比對搜尋到的字串 "abc3qr",這個模式會比對 "abc3"。

.{4,8} 會從該相符項目前面 (而非後面) 開始,比對 4-8 個字元的字串。 這會比對 "abc3qr"。

^ 和 $ 分別指定位於被搜尋字串開頭和結尾的位置。 這是為了避免萬一被搜尋的字串在相符字元外面還包含任何字串,還繼續去比對。

(?!pattern)

右不合樣 (Negative Lookahead): 比對不符合 pattern 的搜尋字串。 在找到相符項目後,下一次就會從符合的文字前面開始比對。 比對不會儲存起來供日後使用。

\b(?!th)\w+\b 會比對不是以 "th" 開頭的文字。

在此模式內,\b 會比對字緣。 對於搜尋到的字串 " quick",這個模式會比對第一個空格。 (?!th) 會比對不是 "th" 的字串。 這會比對 "qu"。

\w+ 會從該相符項目開始比對文字。 這會比對 "quick"。

\cx

比對 x 指出的控制字元。 x 的值必須在 A-Z 或 a-z 的範圍內。 如果不是,則會假設 c 是常值 "c" 字元。

\cM 會比對 CTRL+M 或歸位字元。

\xn

比對 n,其中 n 是十六進位逸出值。 十六進位逸出值的長度必須正好是兩個數字。 允許在規則運算式中使用 ASCII 碼。

\x41 會比對 "A"。 \x041 相當於 "\x04" 後面接 "1" (因為 n 必須正好是 2 個數字)。

\num

比對 num,其中 num 是正整數。 這是已儲存之比對的參考。

(.)\1 會比對兩個連續的相同字元。

\n

識別八進位逸出值或反向參考。 如果 \n 前面有至少 n 個擷取子運算式,則 n 是反向參考。 否則,如果 n 是八進位數字 (0-7),則 n 是八進位逸出值。

(\d)\1 會比對兩個連續的相同數字。

\nm

識別八進位逸出值或反向參考。 如果 \nm 前面有至少 nm 個擷取子運算式,則 nm 是反向參考。 如果 \nm 前面有至少 n 個擷取子運算式,則 n 是反向參考且後接常值 m。 如果上述條件都不存在,則當 n 和 m 是八進位數字 (0-7) 時,\nm 會比對八進位逸出值 nm。

\11 會比對定位字元。

\nml

當 n 是八進位數字 (0-3) 且 m 和 l 是八進位數字 (0-7) 時,則比對八進位逸出值 nml。

\011 會比對定位字元。

\un

比對 n,其中 n 是使用四個十六進位數字表示的 Unicode 字元。

\u00A9 會比對著作權符號 (©)。

非列印字元

下表包含代表非列印字元的逸出序列。

字元

符合項目

相當於

\f

換頁字元。

\x0c 和 \cL

\n

新行字元 (Newline Character)。

\x0a 和 \cJ

\r

歸位字元。

\x0d 和 \cM

\s

任何空白字元。 這包括空格、定位字元和換頁字元。

[ \f\n\r\t\v]

\S

任何非空白字元。

[^ \f\n\r\t\v]

\t

定位字元。

\x09 和 \cI

\v

垂直定位字元。

\x0b 和 \cK

優先順序

規則運算式的評估方式與算術運算式非常相似,都是由左至右,並且遵照優先順序評估。

下表包含規則運算式運算子的計算順序 (由最高排到最低)。

運算子

描述

\

逸出字元

(), (?:), (?=), []

括號和方括號

*, +, ?, {n}, {n,}, {n,m}

數量詞

^, $, \anymetacharacter

錨點和序列

|

替代

字元的順序比替代運算子的順序優先,例如它可以讓 "m|food" 比對 "m" 或 "food"。

請參閱

概念

建立規則運算式