規則運算式是一個字串,簡單的說, 我們在想要搜尋的字串當中夾雜一些特殊符號,指示電腦以非常精準的條件去搜尋,這樣的字串就叫做規則表示式。一般較常使用的範例為身分證字號、電話號碼、信用卡號碼等。
對剛接觸規則運算式的初學者而言,規則表示式看起來就像天書般,完全不知所云,其實熟悉下列特殊字元後,就能了解規則運算式:
\ | 將下一個字元標記為特殊字元、常值、反向參考或八進位逸出。例如,'n' 比對字元 "n"。'\n' 比對新行字元 (Newline Character)。序列 '\\' 比對 "\",而 "\(" 比對 "("。 |
^ | 比對位於輸入字串開頭的位置。如果設定 RegExp 物件的 Multiline 屬性,則 ^ 也比對位於 '\n' 或 '\r' 之後的位置。 |
$ | 比對位於輸入字串結尾的位置。如果設定 RegExp 物件的 Multiline 屬性,則 $ 也比對位於 '\n' 或 '\r' 之前的位置。 |
* | 比對前置字元或子運算式零次或多次。例如,zo* 比對 "z" 和 "zoo"。* 等於 {0,}。 |
+ | 比對前置字元或子運算式一次或多次。例如,'zo+' 比對 "zo" 和 "zoo",但不比對 "z"。+ 等於 {1,}。 |
? | 比對前置字元或子運算式零次或多次。例如,"do(es)?" 比對 "do" 或 "does" 中的 "do"。? 等於 {0,1} |
{n} | n 是非負數的整數。正好比對 n 次。例如,'o{2}' 不比對 "Bob" 中的 'o',而是比對 "food" 中的兩個 o。 |
{n,} | n 是非負數的整數。至少比對 n 次。例如,'o{2,}' 不比對 "Bob" 中的 "o",而是比對 "foooood" 中所有的 o。'o{1,}' 等於 'o+'。'o{0,}' 等於 'o*'。 |
{n,m} | M 和 n 都是非負值的整數,其中 n <= m。至少比對 n 次而且至多比對 m 次。例如,"o{1,3}" 比對 "fooooood" 中的前三個 o。'o{0,1}' 等於 'o?'。請注意,您不可在逗號與數字之間置入空格。 |
? | 當這個字元後面緊接著任何其他限定詞 (*、+、?、{n}、{n,}、{n,m}) 時,比對模式為「非窮盡」(Non-Greedy)。非窮盡模式對於所搜尋到字串,會比對其中最小的部分,而預設的窮盡模式對於所搜尋到字串,則會比對其中最大的部分。例如,在 "oooo" 字串中,'o+?' 比對單一的 "o",而 'o+' 比對所有的 'o'。 |
. | 比對 "\n" 除外的任何單一字元。若要比對包含 '\n' 的任何字元,請使用如 '[\s\S]' 之類的模式。 |
(pattern) | 比對 pattern 並擷取比對的子運算式。擷取的比對可以使用 $0...$9 屬性,從產生的 Matches 集合加以擷取。若要比對括號字元 ( ),請使用 '\(' 或 '\)'。 |
(?:pattern) | 比對 pattern 但不擷取比對的子運算式,意即,它是不會儲存供日後使用的非擷取型比對 (Non-Capturing Match)。這個子運算式有助於將模式的一部分與 "or" 字元 (|) 組合在一起。例如,'industr(?:y|ies) 是比 'industry|industries 更簡約的運算式。 |
(?=pattern) | 執行正 lookahead 搜尋的子運算式,從與任何一個符合 pattern 的字串開頭處,開始比對搜尋字串。這是非擷取型比對,即不會擷取比對以供日後使用。例如 'Windows (?=95|98|NT|2000)' 比對 "Windows 2000" 中的 "Windows",但不比對 "Windows 3.1" 中的 "Windows"。Lookahead 不會耗用字元,即進行比對之後,下一次比對搜尋會緊接在上次比對之後開始,而不是在組成 lookahead 的字元之後開始。 |
(?!pattern) | 執行負 lookahead 搜尋的子運算式,從與任何一個不符合 pattern 的字串開頭處,開始比對搜尋字串。這是非擷取型比對,即不會擷取比對以供日後使用。例如 'Windows (?!=95|98|NT|2000)' 比對 "Windows 3.1" 中的 "Windows",但不比對 "Windows 2000" 中的 "Windows"。Lookahead 不會耗用字元,即進行比對之後,下一次比對搜尋會緊接在上次比對之後開始,而不是在組成 lookahead 的字元之後開始。 |
x|y | 比對 x 或 y。例如,'z|food' 比對 "z" 或 "food"。'(z|f)ood' 比對 "zood" 或 "food"。 |
[xyz] | 字元集 (Character Set)。比對封入字元中的任何字元。例如,'[abc]' 比對 "plain" 中的 'a'。 |
[^xyz] | 負字元集。比對未封入的任何字元。例如,'[^abc]' 比對 "plain" 中的 'p'。 |
[a-z] | 字元範圍。比對指定範圍內的任何字元。例如,'[a-z]' 比對 'a' 到 'z' 範圍內的任何小寫字元。 |
[^a-z] | 負值範圍字元。比對指定範圍以外的任何字元。例如,'[^a-z]' 比對比對 'a' 到 'z' 範圍外的任何字元。 |
\b | 比對字緣,即介於文字與空格之間的位置。例如,'er\b' 比對 "never" 中的 'er',但不比對 "verb" 中的 'er'。 |
\B | 比對非字緣。'er\B' 比對 "verb" 中的 'er',但不比對 "never" 中的 'er'。 |
\cx | 比對 x 指出的控制字元。例如,\cM 會比對 Control-M 或歸位字元 (Carriage Return)。x 值必須在 A-Z 或 a-z 範圍內。若不屬這個範圍內,則假設 c 是常值 'c' 字元。 |
\d | 比對數字字元。等於 [0-9]。 |
\D | 比對非數字字元。等於 [^0-9]。 |
\f | 比對換頁字元。等於 \x0c 和 \cL。 |
\n | 比對新行字元。等於 \x0a 和 \cJ。 |
\r | 比對歸位字元。等於 \x0d 和 \cM。 |
\s | 比對任何泛空白字元,包括空格、定位鍵、換頁字元等等。等於 [\f\n\r\t\v]。 |
\S | 比對任何非泛空白字元。等於 [^ \f\n\r\t\v]。 |
\t | 比對定位鍵字元。等於 \x09 和 \cI。 |
\v | 比對垂直定位鍵字元。等於 \x0b 和 \cK。 |
\w | 比對任何包含底線的文字字元。等於 '[A-Za-z0-9_]'。 |
\W | 比對任何非文字字元。等於 '[^A-Za-z0-9_]'。 |
\xn | 比對 n,其中 n 是十六進位逸出值。十六進位逸出值的長度必須正好是兩個數字。例如,'\x41' 比對 "A"。'\x041' 等於 '\x04' 和 "1"。允許在規則運算式中使用 ASCII 碼。 |
\num | 比對 num,其中 num 是正整數。回到擷取比對的參考。例如,'(.)\1' 比對兩個連續相同的字元。 |
\n | 識別八進位逸出值或反向參考。如果 \n 之前有至少 n 個擷取子運算式,則 n 是反向參考。否則,如果 n 是八進位數字 (0-7),則 n 是八進位逸出值。 |
\nm | 識別八進位逸出值或反向參考。如果 \nm 之前有至少 nm 個擷取子運算式,則 nm 是反向參考。如果 \nm 之前有至少 n 次擷取,則 n 是反向參考且後接常值 (Literal) m。如果不存在上述的任何條件,則當 n 和 m 是八進位數字 (0-7) 時,\nm 會比對八進位逸出值 nm。 |
\nml | 當 n 是八進位數字 (0-3) 且 m 和 l 是八進位數字 (0-7) 時,則比對八進位逸出值 nml。 |
\un | 比對 n,其中 n 是使用四個十六進位數字表示的 Unicode 字元。例如,\u00A9 會比對著作權符號 (©)。 |
由實例可快速熟習規則運算式:
身分證字號的規則運算式:
([a-z]|[A-Z])\d9
身分證字號是由一個英文字母及九個數字組成:「([a-z]|[A-Z])」表示 a 到 z 或 A 到 Z 中的任一個字母,即任何一個大寫或小寫的字母;「d9」表示九個數字。
身分證字號的規則運算式為:
([a-z]|[A-Z])\d{9}
身分證字號是由一個英文字母及九個數字組成:「([a-z]|[A-Z])」表示 a 到 z 或 A 到 Z 中的任一個字母,即任何一個大寫或小寫的字母;「d{9}」表示九個數字。
信用卡號碼的規則運算式為:
\d{4}-\d{4}-\d{4}-\d{4}
「\d{4}」表示四個數字,每四個數字中間有一個減號。
留言列表