正则表达式是一个描述字符模式的对象。JavaScript 的 RegExp 类表示正则表达式,String 和 RegExp 都定义了方法。
正则表达式的定义
- 一种是使用正则表达式直接量,将其包含在一对斜杠
/
之间的字符
1
| var pattern = new RegExp('s')
|
上面两种表达方式是等价的,用来匹配所有以s
结尾的字符串
正则表达式的模式规则是由一个字符序列组成的,所有字母和数字都是按照字面含义进行匹配的
直接量字符
非字母的字符匹配,通过\
反斜杠作为前缀转义
1 2 3 4 5 6 7 8 9 10
| \0 匹配null字符(\u0000) [\b] 匹配退格符(\u0008),区别\b \t 匹配制表符tab(\u0009) \n 匹配换行符(\u000A) \v 匹配垂直制表符(\u000B) \f 匹配换页符(\u000C) \r 匹配回车键(\u000D) \xnn 匹配一个以两位16进制数(\x00-\xFF)表示的字符 \uxxxx 匹配一个以四位16进制数(\u0000-\uFFFF)表示的Unicode字符 \cX 表示Ctrl-[X],其中的X是A-Z之中的任一个英文字母,用来匹配控制字符
|
字符类
1 2 3 4 5 6 7 8 9 10
| [...] 匹配方括号内的任意字符 [^...] 匹配除方括号内的以外的任意字符 . 除换行符和其他Unicode行终止符之外的任意字符 - 匹配范围,如[a-z]表示所有的小写字母 \w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9] \W 任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9] \s 任何Unicode空白符 \S 任何非Unicode空白符的字符 \d 任何非ASCII数字,等价于[0-9] \D 除了ASCII数字之外的任何字符,等价于[^0-9]
|
重复
1 2 3 4 5 6
| {n,m} 匹配前一项至少n次,至多m次 {n,} 匹配前一项至少n次,次数可能比n大 {n} 匹配前一项n次 ? 匹配前一项0次或者1次,等价于{0,1} + 匹配前一项1次或者更多次,等价于{1,} * 匹配前一项0次或者更多次,等价于{0,}
|
注意:因为可以匹配 0 次,所以正在表达式/a/
实际上与字符bbb
匹配,因为这个字符串含 0 个a
非贪婪的重复
默认情况下,匹配重复字符是尽可能多的匹配,而且允许后续的正则表达式继续匹配,即匹配知道下一个字符不满足匹配规则为止,这称为贪婪的匹配
而非贪婪的匹配,一旦条件满足,就不再往下匹配,只需在待匹配的字符后跟随一个问号即可
1 2 3
| var a = /a+/.exec('aaa') var b = /a+?/.exec('aaa')
|
选择、分组和引用
1 2 3 4
| | 分隔供选择的字符,如/ab|cd|ef/表示可以匹配ab或cd或ef 并且,如果匹配了ab就不会再往后匹配 (...) 把单独的项组合成子表达式 \n 引用第n个带括号的子表达式
|
1 2 3
|
var bool = /(.)b(.)\1b\2/.test('abcabc')
|
- 上面的代码中,
\1
表示第一个括号匹配的内容,即第一个(.)
,匹配的是'a'
;\2
表示第二个括号(.)
,匹配的是'c'
- 因为子表达式可以嵌套,所以
(s(ss))
的\2
所表示的是(ss)
- 对正则表达式中前一个子表达式的引用,并不是指对子表达式模式的引用,而指的是哪个模式相匹配的文本的引用
1 2 3
| var res1 = /(a|b)c\1/.test('aca') var res2 = /(a|b)c\1/.test('acb')
|
指定匹配边界
1 2 3 4 5 6
| ^ 匹配字符串的开头,在多行检索中,匹配一行的开头 $ 匹配字符串的结尾,在多行检索中,匹配一行的结尾 \b 匹配一个单词的边界 \B 匹配非单词边界的位置 (?=p) 零宽正向先行断言,要求接下来的字符都与p匹配 (?!p) 零宽负向先行断言,要求接下来的字符不与p匹配
|
修饰符
1 2 3 4
| i 执行不区分大小写的匹配 g 执行一个全局匹配,找到所有的匹配而不是找到一个后就停止 m 多行模式匹配,在这种模式下,如果待检索的字符串包含多行那么^和$除了匹配 整个字符串的开始和结尾之外,还能匹配每行的开始和结尾
|
用于模式匹配的 String 方法
search
:按照给定的正则表达式进行搜索,返回一个整数,表示第一个与之匹配的字符串的起始位置,如果找不到匹配的子串,将返回-1
1
| 'javascript'.search(/script/i)
|
match
:返回一个数组,成员是所有匹配的子字符串,该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
1
| '1 plus 2 equals 3'.match(/\d+/g)
|
replace
:按照给定的正则表达式进行替换,返回替换后的字符串
1 2 3 4 5
| 第二个参数: $` 指代匹配结果前面的文本 $' 指代匹配结果后面的文本 $n 指代匹配成功后的第n组内容,n从1开始
|
1
| 'hello world'.replace(/(\w+)\s(\w+)/, '1')
|
split
:按照给定规则进行字符串分割,返回一个数组,包含分隔后的各个成员
1
| "123,456,789".split(',');
|
RegExp对象
构造函数带有两个参数,第二个参数是可选的
1
| var regexp = new RegExp('\\d{5}','g');
|
包含 5 个属性:
- source:只读字符串,包含正则表达式的文本
- global:只读布尔值,用以说明这个正则表达式是否带有修饰符 g
- ignoreCase:只读布尔值,用以说明正则表达式是否带有修饰符 i
- multiline:只读布尔值,用以说明正则表达式是否带有修饰符 m
- lastIndex:可读写的整数,如果匹配模式带有 g 修饰符,这个属性存储在整个字符串中下一次检索的开始位置
RegExp 方法
exec
:返回匹配结果,如果发现匹配就返回一个数组,成员是每一个匹配成功的子字符串,否则返回 null
test
:返回一个布尔值,表示当前模式是否能匹配参数字符串