leap 2020-03-03
说起正则表达式,可以说是很多同行的痛点,包括我在内,看了会,会了忘,因此写一个系列的小教程,试图加深一下印象。
基本概念
所谓正则表达式,就是一个用于匹配符合某种规则的字符串的表达式。简单来说,就是我们用表达式的形式来创建一个规则,然后拿着这个规则去不同字符串里面进行匹配,看下有没有匹配上我们规则的字符串。
正则对象
要创建正则对象,有两种方法,一是字面量,二是构造函数。
字面量形式,是我们平时最常用的,它简洁美观,大部分时间我们都在使用它,它的组成为 / 自定义规则 /gim ,首尾两个正斜杠,中间是一系列我们自己写的语法规则,末尾是修饰符。
const reg = /\d/g
在上面这个示例中,里面只创建了一个简单的规则,它由一个元字符\d组成,\d(即digital)代表一个数字。
修饰符只有三个,分别是g(global)全局匹配,i(ignoreCase)忽略大小写匹配,m(mutiple)多行匹配。
字面量形式,一般我们吐槽它叫“转义再转义”,这种形式很少用到,它用构造函数去实例化一个正则对象,接收两个参数,第一个参数是正则文本,第二个参数是正则标志。
其中,相比于字面量形式,正则文本不需要首尾两个正斜杠/作为规则边界,其次,正则文本里面的反斜杠需要再用反斜杠\转义一下。
const reg = new RegExp(‘\\d‘, ‘g‘)
这种形式看起来非常啰嗦,好像对比字面量形式它一无是处。
但是有一种情况是必须要用到构造函数形式来实例化正则对象的,那就是:当你需要传入变量的时候。
const TIMES = 3; const reg = new RegExp(`\\d{${TIMES}}`, ‘g‘); // 相当等于const reg = new RegExp(‘\\d{3}‘, ‘g‘)
这里我们需要用一个量词来修饰\d出现了几次,假设这个出现次数需要动态传入,不是写死的,就只能用构造函数形式,上面的例子中,采用ES6的字符串模板将常量TIMES动态传入,这里是为了方便演示写成常量,在实际项目中,它可以是一个动态的传入变量。