1. 1. 正则表达式的定义
  2. 2. 直接量字符
  3. 3. 字符类
  4. 4. 重复
  5. 5. 非贪婪的重复
  6. 6. 选择、分组和引用
  7. 7. 指定匹配边界
  8. 8. 修饰符
  9. 9. 用于模式匹配的 String 方法
  10. 10. RegExp对象
  11. 11. RegExp 方法
JavaScript正则表达式

正则表达式是一个描述字符模式的对象。JavaScript 的 RegExp 类表示正则表达式,String 和 RegExp 都定义了方法。

正则表达式的定义

  • 一种是使用正则表达式直接量,将其包含在一对斜杠/之间的字符
1
var pattern = /s$/
  • 另一种是使用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
//exec() 方法用于检索字符串中的正则表达式的匹配,返回一个数组
var a = /a+/.exec('aaa') //["aaa"]
var b = /a+?/.exec('aaa') //["a"]

选择、分组和引用

1
2
3
4
|    分隔供选择的字符,如/ab|cd|ef/表示可以匹配ab或cd或ef
并且,如果匹配了ab就不会再往后匹配
(...) 把单独的项组合成子表达式
\n 引用第n个带括号的子表达式
1
2
3
//test() 方法用于检测一个字符串是否匹配某个模式
//如果字符串中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false
var bool = /(.)b(.)\1b\2/.test('abcabc') //true
  • 上面的代码中,\1表示第一个括号匹配的内容,即第一个(.),匹配的是'a'\2表示第二个括号(.),匹配的是'c'
  • 因为子表达式可以嵌套,所以(s(ss))\2所表示的是(ss)
  • 对正则表达式中前一个子表达式的引用,并不是指对子表达式模式的引用,而指的是哪个模式相匹配的文本的引用
1
2
3
var res1 = /(a|b)c\1/.test('aca') //true
var res2 = /(a|b)c\1/.test('acb') //false
//'(a|b)'匹配了a之后,'\1'也代表a

指定匹配边界

1
2
3
4
5
6
^    匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配

修饰符

1
2
3
4
i     执行不区分大小写的匹配
g 执行一个全局匹配,找到所有的匹配而不是找到一个后就停止
m 多行模式匹配,在这种模式下,如果待检索的字符串包含多行那么^和$除了匹配
整个字符串的开始和结尾之外,还能匹配每行的开始和结尾
1
var x = /test/gi

用于模式匹配的 String 方法

  • search:按照给定的正则表达式进行搜索,返回一个整数,表示第一个与之匹配的字符串的起始位置,如果找不到匹配的子串,将返回-1
1
'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+)/, '
2 


1') //"world hello"
  • split:按照给定规则进行字符串分割,返回一个数组,包含分隔后的各个成员
1
"123,456,789".split(','); //["123","456","789"]

RegExp对象

构造函数带有两个参数,第二个参数是可选的

1
var regexp = new RegExp('\\d{5}','g'); //全局查找5个数字

包含 5 个属性:

  • source:只读字符串,包含正则表达式的文本
  • global:只读布尔值,用以说明这个正则表达式是否带有修饰符 g
  • ignoreCase:只读布尔值,用以说明正则表达式是否带有修饰符 i
  • multiline:只读布尔值,用以说明正则表达式是否带有修饰符 m
  • lastIndex:可读写的整数,如果匹配模式带有 g 修饰符,这个属性存储在整个字符串中下一次检索的开始位置

RegExp 方法

  • exec:返回匹配结果,如果发现匹配就返回一个数组,成员是每一个匹配成功的子字符串,否则返回 null
  • test:返回一个布尔值,表示当前模式是否能匹配参数字符串