1. 1. 正则表达式的定义
  2. 2. 直接量字符
  3. 3. 字符类
  4. 4. 重复
  5. 5. 非贪婪的重复
  6. 6. 选择、分组和引用
  7. 7. 指定匹配边界
  8. 8. 修饰符
  9. 9. 用于模式匹配的String方法
  10. 10. 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/ig

用于模式匹配的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:按照给定规则进行字符串分割,返回一个数组,包含分隔后的各个成员
    ​```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:返回匹配结果,如果发现匹配就返回一个数组,成员是每一个匹配成功的子字符串,否则返回null
  • test:返回一个布尔值,表示当前模式是否能匹配参数字符串