#第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