#第10章 正則表達式的模式匹配
- <a href="#no1">10.1 正則表達式的定義</a>
- <a href="#no2">10.2 用于模式匹配的String方法</a>
- <a href="#no3">10.3 RegExp對象</a>
正則表達式是一個描述字符模式的對象。JS的`RegExp`類表示正則表達式。
##<a name="no1">10.1 正則表達式的定義</a>
**正則表達式直接量定義為包含在一堆斜杠(`/`)之間的字符。**
###10.1.1 直接量字符
- `\o` NUL字符(\u0000)
- `\t` 制表符(\0009)
- `\n` 換行符(\u000A)
- `\v` 垂直制表符(\u000B)
- `\f` 換行符(\u000C)
- `\r` 回車符(\u000D)
- `\xnn` 由十六進制數nn指定的拉丁字符
- `\uxxxx` 由十六進制數xxxx指定的Unicode字符
- `\cX` 控制字符`^X`
> 在正則表達式中,許多標點符號具有特殊含義。`^ $ . * + ? ~ | \ / ( ) [ ] { } `
###10.1.2 字符類
- `[...]` 方括號內的任意字符
- `[^...]` 不在方括號內的任意字符
- `.` 除換行符和其他Uincode行終止符之外的任意字符
- `\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]` 退格直接量
###10.1.3 重復
- `{n,m}` 匹配前一項至少n次,但不能超過m次
- `{n,}` 匹配前一項n次或更多次
- `{n}` 匹配前一項n次
- `?` 匹配前一項0次或者1次,也就是說前一項是可選的,等價于`{0,1}`
- `+` 匹配前一項1次或多次,等價于`{1,}`
- `*` 匹配前一項0次或多次,等價于`{0,}`
**非貪婪的重復:只需在待匹配的字符后跟隨一個問號即可。**
###10.1.4 選擇、分組和引用
- `|` 選擇,匹配的是該符號左邊的子表達式或右邊的子表達式
- `(...)` 組合,將幾個項組合為一個單元
- `(?:...)` 只組合,把項組合到一個單元,但不記憶與該組相匹配的字符
- `\n` 和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式。組索引是從左到右的左括號數。
###10.1.5 指定匹配位置
- `^` 匹配字符串的開頭,在多行檢索中,匹配一行的開頭
- `$` 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
- `\b` 匹配一個單詞的邊界。
- `\B` 匹配非單詞邊界的位置
- `(?=p)` 零寬正向先行斷言,要求接下來的字符都與p匹配,但不能包括匹配p的那些字符
- `(?!p)` 零寬負向先行斷言,要求接下來的字符不與p匹配
###10.1.6 修飾符
- `i` 執行不區分大小寫的匹配
- `g` 執行一個全局匹配
- `m` 多行匹配模式
##<a name="no2">10.2 用于模式匹配的String方法</a>
1. `search()`:參數是一個正則表達式,返回第一個與之匹配的子串的起始位置,如果找不到匹配的子串,返回`-1`。
2. `replace()`:用來執行檢索與替換操作。第一個參數是一個正則表達式,第二個參數是要進行替換的字符串。
3. `match()`:唯一的一個參數就是一個正則表達式,返回的是一個由匹配結果組成的數組。
4. `split()`:唯一的一個參數就是一個正則表達式,可以將調用它的字符串拆分為一個子串組成的數組。
##<a name="no3">10.3 RegExp對象</a>
###10.3.1 RegExp的屬性
每個`RegExp`對象都包含5個屬性。
1. `source`:一個只讀的字符串,包含正則表達式文本。
2. `global`:一個只讀的布爾值,用以說明這個正則表達式是否帶有修飾符`g`。
3. `ignoreCase`:一個只讀布爾值,用以說明正則表達式是否帶有修飾符`i`。
4. `multiline`:一個只讀布爾值,用以說明正則表達式是否帶有修飾符`m`。
5. `lastInde`:一個可讀/寫的整數。
###10.3.2 RegExp的方法
1. `exec()`:對一個執行的字符串執行一個正則表達式。如果有匹配則返回一個數組,無匹配則返回`null`。
2. `test()`:參數是一個字符串,如果包含正則表達式的一個匹配結果,則返回`true`。
var pattern = /java/i;
pattern.test('javaScript'); //返回 true