正则表达式是一个描述字符模式的对象。JavaScript的RegExp类表示正则表达式,String和RegExp都定义了方法。
正则表达式的定义
- 一种是使用正则表达式直接量,将其包含在一对斜杠
/
之间的字符1
var pattern = /s$/;
- 另一种是使用
RegExp()
构造函数上面两种表达方式是等价的,用来匹配所有以1
var pattern = new RegExp('s');
s
结尾的字符串
正则表达式的模式规则是由一个字符序列组成的,所有字母和数字都是按照字面含义进行匹配的
直接量字符
非字母的字符匹配,通过\
反斜杠作为前缀转义
1 | \0 匹配null字符(\u0000) |
字符类
1 | [...] 匹配方括号内的任意字符 |
重复
1 | {n,m} 匹配前一项至少n次,至多m次 |
注意:因为可以匹配0次,所以正在表达式/a/
实际上与字符bbb
匹配,因为这个字符串含0个a
非贪婪的重复
默认情况下,匹配重复字符是尽可能多的匹配,而且允许后续的正则表达式继续匹配,即匹配知道下一个字符不满足匹配规则为止,这称为贪婪的匹配
而非贪婪的匹配,一旦条件满足,就不再往下匹配,只需在待匹配的字符后跟随一个问号即可
1 | //exec() 方法用于检索字符串中的正则表达式的匹配,返回一个数组 |
选择、分组和引用
1 | | 分隔供选择的字符,如/ab|cd|ef/表示可以匹配ab或cd或ef |
1 | //test() 方法用于检测一个字符串是否匹配某个模式 |
- 上面的代码中,
\1
表示第一个括号匹配的内容,即第一个(.)
,匹配的是'a'
;\2
表示第二个括号(.)
,匹配的是'c'
- 因为子表达式可以嵌套,所以
(s(ss))
的\2
所表示的是(ss)
- 对正则表达式中前一个子表达式的引用,并不是指对子表达式模式的引用,而指的是哪个模式相匹配的文本的引用
1 | var res1 = /(a|b)c\1/.test('aca'); //true |
指定匹配边界
1 | ^ 匹配字符串的开头,在多行检索中,匹配一行的开头 |
修饰符
1 | i 执行不区分大小写的匹配 |
1 | var x = /test/ig |
用于模式匹配的String方法
search
:按照给定的正则表达式进行搜索,返回一个整数,表示第一个与之匹配的字符串的起始位置,如果找不到匹配的子串,将返回-11
"javascript".search(/script/i); //4
match
:返回一个数组,成员是所有匹配的子字符串,该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本1
"1 plus 2 equals 3".match(/\d+/g); //["1","2","3"]
replace
:按照给定的正则表达式进行替换,返回替换后的字符串1
2
3
4
5第二个参数:
$` 指代匹配结果前面的文本
$' 指代匹配结果后面的文本
$n 指代匹配成功后的第n组内容,n从1开始1
"hello world".replace(/(\w+)\s(\w+)/,'1'); //"world hello"
split
:按照给定规则进行字符串分割,返回一个数组,包含分隔后的各个成员
```javascript
“123,456,789”.split(‘,’); //[“123”,”456”,”789”]1
2
3
4
5
## RegExp对象
构造函数带有两个参数,第二个参数是可选的
```javascript
var regexp = new RegExp('\\d{5}','g'); //全局查找5个数字包含5个属性:
source:只读字符串,包含正则表达式的文本
global:只读布尔值,用以说明这个正则表达式是否带有修饰符g
ignoreCase:只读布尔值,用以说明正则表达式是否带有修饰符i
multiline:只读布尔值,用以说明正则表达式是否带有修饰符m
lastIndex:可读写的整数,如果匹配模式带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置
RegExp方法
exec
:返回匹配结果,如果发现匹配就返回一个数组,成员是每一个匹配成功的子字符串,否则返回nulltest
:返回一个布尔值,表示当前模式是否能匹配参数字符串