## 12.1 創建
新建正則表達式有兩種方法。
* 使用字面量,以**斜杠表示開始和結束**。
~~~
var regex = /xyz/;
~~~
* 使用**RegExp構造函數**。
~~~
var regex = new RegExp('xyz');
~~~
上面兩種寫法是等價的,都新建了一個內容為xyz的正則表達式對象。它們的主要區別是,第一種方法在編譯時新建正則表達式,第二種方法在運行時新建正則表達式。
正則表達式的模式規則是由一個字符序列組成的,所有字母和數字都是按照字面含義進行匹配的。
### 12.1.1 直接量字符
JavaScript正則表達式語法也支持非字母的字符匹配,這些字符需要通過反斜杠(\)作為前綴進行轉義。
有如下直接量字符:
~~~
\0 匹配null字符(\u0000)。
[\b] 匹配退格鍵(\u0008),不要與\b混淆。
\t 匹配制表符tab(\u0009)。
\n 匹配換行鍵(\u000A)。
\v 匹配垂直制表符(\u000B)。
\f 匹配換頁符(\u000C)。
\r 匹配回車鍵(\u000D)。
\xnn 匹配一個以兩位十六進制數(\x00-\xFF)表示的字符。
\uxxx 匹配一個以四位十六進制數(\u0000-\uFFFF)表示的unicode字符。
\cX 表示Ctrl-[X],其中的X是A-Z之中任一個英文字母,用來匹配控制字符。
~~~
### 12.1.2 字符類
將直接量字符單獨放進方括號就組成了**字符類(character class)**。一個字符類可以**匹配它所包含的任意字符**。比如:/[abc]/就和字母“a”、“b”、“c”中的任意一個都匹配。
可以通過`^`符號來定義**否定字符類**,它**匹配所有不包含括號內的字符**。定義否定字符類時,將一個“^”符號作為左方括號內的第一個字符。比如: /[^abc]/ 匹配的是“a”、“b”、“c”之外的所有字符。’
字符類還可以使用**連字符來表示字符范圍**。比如要匹配拉丁字母表中的小寫字母,可以使用 /[a-z]/ ,要匹配拉丁字母表中的任何字母和數字,則使用 /[a-zA-Z0-9]/ 。
注意:字符類的**連字符必須在頭尾兩個字符中間**,才有特殊含義,否則就是字面含義。比如,[-9]就表示匹配連字符和9,而不是匹配0到9。
**正則表達式的字符類:**
|字符類| 說明|
|---|---|
| [...] | 方括號內的任意字符|
| [^...]| 不在方括號內的任意字符|
| . | 除換行符和其他Unicode行終止符之外的任意字符|
| \w | 任何ASCII字符組成的單詞,等價于[a-zA-Z0-9]|
| \W | 任何不適ASCII字符組成的單詞,等價于[^a-zA-Z0-9]|
| \s | 任何Unicode空白符|
| \S | 任何非Unicode空白符的字符|
| \d | 任何非ASCII數字,等價于[0-9]|
| \D | 除了ASCII數字之外的任何字符,等價于[^0-9]|
| [\b] | 退格直接量|
注意:在方括號之內也可以寫上面這些特殊轉義字符。但有一個特例:當轉義符 \b 用在字符類中時,它表示的是退格符,所以要在正則表達式中按照直接量表示一個退格符時,只需使用 /[\b]/ 即可。
### 12.1.3 重復
在正則模式之后跟隨用以指定字符重復的標記。
**正則表達式的重復字符語法:**
|||
|---|---|
| {n,m} | 匹配前一項至少n次,至多m次|
| {n,} | 匹配前一項n次或者更多次,也可以說至少n次|
| {n} | 匹配前一項n次|
| ? | 匹配前一項0次或者1次,等價于{0,1}|
| + | 匹配前一項1次或多次,等價于{1,}|
| * | 匹配前一項0次或多次,等價于{0,}|
注意:在使用“”和“?”時,由于這些字符可能匹配0個字符,因此它們允許什么都不匹配。比如:正則表達式/a/實際上與字符串“bbb”匹配,因為這個字符串含有0個a。
### 12.1.4 非貪婪的重復
默認情況下,匹配重復字符是盡可能多的匹配,而且允許后續的正則表達式繼續匹配,即匹配直到下一個字符不滿足匹配規則為止,這稱為“貪婪的”匹配。
當然,我們也可以使用正則表達式進行非貪婪匹配,一旦條件滿足,就不再往下匹配。,只須在待匹配的字符后跟隨一個問號即可:“??”、“+?”、“*?”或“{1,5}?”。
~~~
/a+/.exec('aaa') //["aaa"]
/a+?/.exec('aaa') //["a"]
~~~
### 12.1.5 選擇、分組和引用
正則表達式的語法還包括**指定選擇項、子表達式分組和引用前一子表達式的特殊字符**。
* 字符“|”用于分隔供選擇的字符,比如:/ab|cd|ef/可以匹配字符串“ab”,也可以匹配字符串“cd”,還可以匹配字符串“ef”。
注意:選擇項的嘗試匹配次序是從左到右,直到發現了匹配項。如果左邊的選擇項匹配,就會忽略右邊的匹配項,即使它產生更好的匹配。比如:當正在表達式/a|ab/匹配字符串“ab”時,它只能匹配第一個字符。
* 圓括號“()”可以把單獨的項組合成子表達式。
帶圓括號的表達式的另一個用途是允許在同一正則表達式的后部引用前面的子表達式,這是通過在字符“\”后加一位或多位數字來實現的,這個數字指定了帶圓括號的子表達式在正則表達式中的位置。比如:\1引用的是第一個帶圓括號的子表達式,\3引用的是第三個帶圓括號的子表達式。
~~~
/(.)b(.)\1b\2/.test('abcabc') //true
~~~
上面的代碼中,\1表示第一個括號匹配的內容,即第一個(.),匹配的是“a”;\2表示第二個括號(.),匹配的是“c”。
注意:因為子表達式可以嵌套另一個子表達式,所以引用的位置是參與計數的左括號的位置。比如:(s(ss)),\2表示的是(ss)。
對正則表達式中前一個子表達式的引用,并不是指對子表達式模式的引用,而指的是那個模式相匹配的文本的引用。
~~~
/(a|b)c\1/.test('aca') //true
/(a|b)c\1/.test('acb') //false
~~~
上面的代碼中,由于(a|b)匹配的是a,所以\1所對應的也應該是a。
正則表達式的選擇、分組和引用字符
|||
|||
| `/` (直) | 選擇,匹配的是該符號左邊的子表達式或右邊的子表達式 |
| (...) | 組合,將幾個項組合為一個單位,這個單位可通過` "*"、"+"、"?" 和 "/" `等符號加以修飾,而且可以記住和這個組合相匹配的字符串以供此后的引用使用。|
| (?...) | 只組合,把項組合到一個單位,但不記憶與該組相匹配的字符|
| \n | 和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式(也有可能是嵌套的),組索引是從左到右的左括號數,“(?:”形式的分組不編碼|
### 12.1.6 指定匹配位置
除了匹配字符串中的字符外,有些正則表達式的元素匹配的是字符之間的位置,亦可稱為**正則表達式的錨**。比如:\b匹配一個單詞的邊界,即位于\w(ASCII單詞)字符和\W(非ASCII單詞)之間的邊界,或位于一個ASCII單詞與字符串的開始或結尾之間的邊界。
**正則表達式中的錨字符:**
|||
|||
| ^ | 匹配字符串的開頭,在多行檢索中,匹配一行的開頭|
| $ | 匹配字符串的結尾,在多行檢索中,匹配一行的結尾|
| \b | 匹配一個單詞的邊界|
| \B | 匹配非單詞邊界的位置|
| (?=p) | 零寬正向先行斷言,要求接下來的字符都與p匹配,但不能包括匹配p的那些字符|
| (?!p) | 零寬負向先行斷言,要求接下來的字符不與p匹配|
### 12.1.7 修飾符
正則表達式的修飾符,用以說明高級匹配模式的規則。修飾符是放在“/”符號之外的,也就是說,它們不是出現在兩條斜杠之間的,而是在第二條斜杠之后。
在JavaScript中,支持三個修飾符:
|||
|||
| i | 執行不區分大小寫的匹配|
| g| 執行一個全局匹配,即找到所有的匹配,而不是在找到第一個之后就停止|
| m| 多行模式匹配,在這種模式下,如果待檢索的字符串包含多行,那么^和$錨字符除了匹配整個字符串的開始和結尾之外,還能匹配每行的開始和結尾|
這些修飾符可以任意組合。比如:
~~~
/test/ig
~~~
- 前言
- 第一章 JavaScript簡介
- 第三章 基本概念
- 3.1-3.3 語法、關鍵字和變量
- 3.4 數據類型
- 3.5-3.6 操作符、流控制語句(暫略)
- 3.7函數
- 第四章 變量的值、作用域與內存問題
- 第五章 引用類型
- 5.1 Object類型
- 5.2 Array類型
- 5.3 Date類型
- 5.4 基本包裝類型
- 5.5 單體內置對象
- 第六章 面向對象的程序設計
- 6.1 理解對象
- 6.2 創建對象
- 6.3 繼承
- 第七章 函數
- 7.1 函數概述
- 7.2 閉包
- 7.3 私有變量
- 第八章 BOM
- 8.1 window對象
- 8.2 location對象
- 8.3 navigator、screen與history對象
- 第九章 DOM
- 9.1 節點層次
- 9.2 DOM操作技術
- 9.3 DOM擴展
- 9.4 DOM2和DOM3
- 第十章 事件
- 10.1 事件流
- 10.2 事件處理程序
- 10.3 事件對象
- 10.4 事件類型
- 第十一章 JSON
- 11.1-11.2 語法與序列化選項
- 第十二章 正則表達式
- 12.1 創建正則表達式
- 12.2-12.3 模式匹配與RegExp對象
- 第十三章 Ajax
- 13.1 XMLHttpRequest對象
- 你不知道的JavaScript
- 一、作用域與閉包
- 1.1 作用域
- 1.2 詞法作用域
- 1.3 函數作用域與塊作用域
- 1.4 提升
- 1.5 作用域閉包
- 二、this與對象原型
- 2.1 關于this
- 2.2 全面解析this
- 2.3 對象
- 2.4 混合對象“類”
- 2.5 原型
- 2.6 行為委托
- 三、類型與語法
- 3.1 類型
- 3.2 值
- 3.3 原生函數