正则表达式是一种用来匹配字符串中的字符组合的模式。常用来做参数验证、字符匹配、字符查找及字符替换。由于总是零星的记一些规则,又总是会忘,所以就打算简单的总结一下,以便后续可以查阅以及整理。

文中以javascript中的正则来介绍。

创建正则表达式

js中有两种方式来定义正则表达式。
正则表达式字面量

1
const re = /pattern/attributes;

正则表达式字面量在脚本加载后编译。若你的正则表达式是常量,使用这种方式可以获得更好的性能。
使用RegExp对象的构造函数

1
const re = new RegExp(pattern, attributes);

使用构造函数,提供了对正则表达式运行时的编译。当你知道正则表达式的模式会发生改变, 或者你事先并不了解它的模式或者是从其他地方(比如用户的输入),得到的代码这时比较适合用构造函数的方式。

使用 new RegExp 的时候需要对 \ 进行转义。而字面量不需要。
使用new RegExp对象每次都会重新创建变量。

attributes为修饰符。有i、g和m三个值。

1
2
3
i: 忽略大小写匹配
g: 全局匹配(查找所有匹配而不是匹配一个停止)
m: 多行匹配

元字符

正则表达式有一些字符具有特殊的用途,称为元字符。
常见有如下一些元字符:

1
2
3
4
5
^ 字符串开头
$ 字符串结尾
. 匹配任何一个除换行和行结束符的字符
[] 定义一个字符集合,可以是中括号内的任意一个字符。可以使用 - 来定义一个范围,如[a-z]。
[^xyz] 反向字符集,匹配任何不在中括号中的一个字符。

转义字符

1
2
3
4
\n : 换行符
\r : 回车符
\t : 制表符
\0 : 空字符

1
2
3
4
5
6
7
8
\w : 匹配单词字符
\W : 匹配所有非单词字符
\d : 数字
\D : 非数字
\s : 空白字符
\S : 非空白字符
\b : 单词边界
\B : 非单词边界

量词

1
2
3
4
5
6
+ : 1个或多个字符
* : 0个或多个字符
? : 0个或1个字符
{x} : x个字符
{x,y} : x到y个字符
{x,} : 至少x个字符

分组和反向引用

可以使用()来将若干字符分组。使用分组匹配的字符将会被暂存起来,可以使用\n(n为第几个分组)来进行反向引用。

1
2
3
4
5
//使用分组和反向引用
/(hello)\1/ // 可以匹配hellohello
// 不缓存分组
(?:分组内容) // 使用?:来取消缓存分组内容

参考

[1] MDN 正则表达式
[2] w3cschool正则表达式
[3] 一起来啃犀牛书:正则表达式