MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

正規表達式模式的編寫

正規表達式的模式是由簡單的字元所組成,如 /abc/,或由簡單的和特殊的字元所組成,如 /ab*c//Chapter (\d+)\.\d*/。後者含有用來記憶的括弧。以模式的某一部分所產生的比對結果會被記憶起來以供稍後使用,已在 括弧子字串的比對結果的運用 一文中解說。

簡單模式的使用

簡單的模式直接由想要尋找的字元所組成。例如,/abc/ 的模式只在字元 'abc' 以同樣順序一起出現時,比對出字串裡的字元。在字串 "Hi, do you know your abc's?" 和 "The latest airplane designs evolved from slabcraft." 中將會比對成功。在兩個例子中,都比對出子字串 'abc'。在字串 "Grab crab" 中沒有比對結果,因為字串裡並未含有子字串 'abc'。

特殊字元的使用

當搜尋的需求遠遠超出直接比對的能力時,如尋找 1 個以上的全部的 b,或是尋找含有特殊字元的空白部分。舉例來說,/ab*c/ 的模式可比對出所有以 'a' 後接 0 個以上的全部的 'b'(* 的意思是前項出現 0 個以上)並緊接者 'c' 的字元。在字串 "cbbabbbbcdebc" 裡,可以比對出子字串 'abbbbc'。

下表提供完整的列表,並解說可用於正規表達式的特殊字元。

字元 意義
\ 可分為以下兩種︰
  • 對於那些沒有特殊意義的字元,反斜線可指示下一個字元為特殊的、不照字面解譯。舉例來說,/b/ 比對字元 'b'。藉由在 b 前面放置反斜線,也就是使用 /\b/,這個字元的特殊意義就變成比對文字的邊界。
  • 對於那些有特別意義的字元,就利用反斜線指示下一個字元並非特殊的、應該照字面解譯。舉例來說,* 是一個意義為前項出現 0 個以上的特殊字元。例如,/a*/ 意思是比對 0 個以上的全部的 a。如果要照字面比對 *,就在前面加上反斜線。例如,/a\*/ 比對出 'a*'。
^ 比對輸入的開頭處。如果把多行標誌設為 true,也會比對緊接在換行字元之後的字元。舉例來說,/^A/ 不會在 "an A" 裡比對出 'A',但會在 "An A" 裡比對出第一個 'A'。
$ 比對輸入的末尾處。如果把多行標誌設為 true,也會比對緊接在換行字元之前的字元。舉例來說,/t$/ 不會在 "eater" 裡比對出 't',但會在 "eat" 裡比對出來。
* 比對前面的字元 0 次以上。舉例來說,/bo*/ 在 "A ghost booooed" 比對出 'boooo',並在 "A bird warbled" 比對出 'b',但不會在 "A goat grunted" 比對出來。
+ 比對前面的字元 1 次以上。等價於 {1,}。舉例來說,/a+/ 在 "candy" 比對出 'a',並在 "caaaaaaandy" 比對出所有的 a。
? 比對前面的字元 0 次或 1 次。

舉例來說,/e?le?/ 在 "angel" 比對出 'el',並在 "angle" 比對出 'le'。

如果緊接在任何一個數量子 *、+、?、{} 之後來使用,將使數量子非貪婪(比對出最小的次數),而預設值是貪婪的(比對出最大的次數)。舉例來說,使用 /\d+/ 比對 "123abc" 便返回 "123",如果使用 /\d+?/,只有 "1" 會被比對出來。

也用於表示預讀,在本表的 x(?=y) 和 x(?!y) 中有說明。
. 小數點比對任意的單一字元,除了換行字元以外。舉例來說,/.n/ 在 "nay, an apple is on the tree" 比對出 'an' 和 'on',而非 'nay'。
(x) 比對 'x' 並記憶此項比對結果。又稱為截取括弧(capturing parentheses)。舉例來說,/(foo)/ 在 "foo bar" 裡比對出並記憶 'foo'。比對出來的子字串可以從比對結果的陣列的元素 1, ..., n 取回。
(?:x) 比對 'x' 但不記憶此項比對結果。又稱為非截取括弧。比對出來的子字串無法從比對結果的陣列的元素 1, ..., n 取回。
x(?=y) 比對 'x' 但只在 'x' 後面接續著 'y' 的時候。舉例來說,/Jack(?=Sprat)/ 只在後面接續著 'Sprat' 的時候比對出 'Jack'。/Jack(?=Sprat|Frost)/ 只在後面接續著 'Sprat' 或 'Frost' 的時候比對出 'Jack'。然而,'Sprat' 或 'Frost' 都不是比對結果的一部分。
x(?!y) 比對 'x' 但只在 'x' 後面沒有接續著 'y' 的時候。舉例來說,/\d+(?!\.)/ 只在後面沒有接續著小數點的時候比對出數字。正規表達式 /\d+(?!\.)/.exec("3.141") 比對出 '141' 而非 '3.141'。
x|y 比對 'x' 或 'y'。舉例來說,/green|red/ 在 "green apple" 比對出 'green',並在 "red apple"比對出 'red'。
{n} 在此 n 是正整數。比對出恰好有 n 個的前面的字元。舉例來說,/a{2}/ 不會在 "candy" 裡比對出 'a',但在 "caandy" 裡比對出全部的 a,並在 "caaandy" 裡比對出前兩個 a。
{n,} 在此 n 是正整數。比對出至少 n 個的前面的字元。舉例來說,/a{2,}/ 不會在 "candy" 裡比對出 'a',但在 "caandy" 還有在 "caaaaaaandy" 裡比對出全部的 a。
{n,m} 在此 n 和 m 是正整數。比對出至少 n 個且至多 m 個的前面的字元。舉例來說,/a{1,3}/ 在 "cndy" 裡比對不出來,但在 "candy" 比對出 'a',在 "caandy" 比對出前兩個 a,並在 "caaaaaaandy" 比對出前三個 a,注意,當比對 "caaaaaaandy" 的時候,比對的是 "aaa",即使字串裡有更多的 a。
xyz 字元集。比對出包含在括號裡的其中任何一個字元。你可以使用連接符號 (-) 指定字元的範圍。舉例來說,abcd 等於 a-d。這些都能在 "brisket" 裡比對 'b',並在 "city" 裡比對 'c'。
^xyz 字元否定集、或字元補集。也就是比對出任何不包含在括號裡的一切。你可以使用連接符號 (-) 指定字元的範圍。舉例來說,^abc 等於 ^a-c。這些都能在 "brisket" 裡比對出第一個字母 'r',並在 "chop" 比對出 'h'。
\\b 比對退格。(別和 \b 混淆。)
\b 比對文字邊界,如空白或換行字元。(別和 \\b 混淆。)舉例來說,/\bn\w/ 在 "noonday" 裡比對出 'no',/\wy\b/ 在 "possibly yesterday" 比對出 'ly'。
\B 比對非文字邊界。舉例來說,/\w\Bn/ 在 "noonday" 裡比對出 'on',/y\B\w/ 在 "possibly yesterday" 裡比對出 'ye'。
\cX 在此 X 是控制字元。在字串中比對控制字元。舉例來說,/\cM/ 在字串裡比對出 control-M。
\d 比對數字字元。等於 0-9。舉例來說,/\d//0-9/ 都在 "B2 is the suite number" 比對出 '2'。
\D 比對非數字字元。等於 ^0-9。舉例來說,/\D//^0-9/ 都在 "B2 is the suite number" 比對出 'B'。
\f 比對換頁(form-feed)。
\n 比對換行。
\r 比對歸位。
\s 比對單一空白字元,包括空白、TAB、換頁、換行。等於 

\\f\\n\\r\\t\\v\\u00A0\\u2028\\u2029

舉例來說,/\s\w*/ 在 "foo bar" 裡比對出 ' bar'。
\S 比對除了空白字元以外的單一字元。等於

^ \\f\\n\\r\\t\\v\\u00A0\\u2028\\u2029

舉例來說,/\S\w*/ 在 "foo bar" 裡比對出 'foo'。
\t 比對 TAB。
\v 比對垂直 TAB。
\w 比對任何字母和數字的字元,包括底線。等於 A-Za-z0-9_。舉例來說,/\w/ 在 "apple" 裡比對出 'a',在 "$5.28" 裡比對出 '5',並在 "3D" 比對出 '3'。
\W 比對任何非字母和數字的字元。等於 [^A-Za-z0-9_]。舉例來說,/\W//[^A-Za-z0-9_]/ 在 "50%" 裡比對出 '%'。
\n 在此 n 是正整數。回向參考在正規表達式中的第 n 個括弧中比對的最後的子字串(對左括弧計數)。舉例來說,/apple(,)\sorange\1/ 在 "apple, orange, cherry, peach" 裡比對出 'apple, orange,'。
\0 比對 NUL 字元。後面不可以接續其他數字。
\xhh 比對內碼為 hh 的字元(兩個十六進位數)
\uhhhh 比對內碼為 hhhh 的字元(四個十六進位數)

表 4.1: 正規表達式裡的特殊字元。

括弧的使用

使用括弧把正規表達式的模式的某一部分括起來,就會記憶那部分被比對出來的子字串。一經記憶,就可以在其他地方取回並使用。可在 括弧子字串的比對結果的運用 一文中找到說明。

舉例來說,以 /Chapter (\d+)\.\d*/ 的模式來解說額外的跳脫和特殊字元,那些用來指示某一部分模式需要記憶的部分。他會比對恰好是 'Chapter ' 的字元,隨後是 1 個以上的數字(\d 的意思是任意數字字元,+ 的意思是 1 次以上),隨後是一個小數點(點本身是特殊字元,前面附上 \ 的點的意思是這個模式必須尋找字面為 '.' 的字元),隨後是任何 0 個以上的數字(\d 的意思是任意數字字元,* 的意思是 0 次以上)。此外,括弧被用來記憶第一次比對出來的數字字元。

在 "Open Chapter 4.3, paragraph 6" 裡可以找出這個模式,且 '4' 會被記憶。在 "Chapter 3 and 4" 裡則找不出這個模式,因為字串裡的 '3' 後面沒有點。

若要比對子字串,且不要記憶比對出來的那一部分,可在括弧裡面的最前面加上 ?:。舉例來說,(?:\d+) 比對 1 個以上的數字字元,但不會記憶那些比對出來的字元。

 

文件標籤與貢獻者

 此頁面的貢獻者: wildsky, teoli, happysadman
 最近更新: wildsky,