js正则表达式小结
文中以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] 一起来啃犀牛书:正则表达式