規則運算式語法
「規則運算式」(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"。