正则的命名,反向引用和断言

2019 / 11 / 16

分组命名

写个版本号的正则

const reg = /\d+\.\d+\.\d+/
const matched = '1.2.1'.match(reg)

写一个版本号区间的正则

const reg = /\d+\.\d+\.\d+~\d+\.\d+\.\d+/
const matched = '1.2.1~1.2.10'.match(reg)

通过分组可以很好的拿到开始和结束的版本

const reg = /(\d+\.\d+\.\d+)~(\d+\.\d+\.\d+)/
const matched = '1.2.1~1.2.3'.match(reg)
const [matchedString, startVersion, endVersion] = matched

matched返回一个数组,是所有的捕获到的结果,所以我们需要数一下我们要的分组是第几个就会不太方便,可以用分组命名的方式,分组命名的语法是在分组的最前面写上 ?<groupName>

const reg = /(?<startVersion>\d+\.\d+\.\d+)~(?<endVersion>\d+\.\d+\.\d+)/
const matched = '1.2.1~1.2.3'.match(reg)
const { startVersion, endVersion } = matched.groups // 1.2.1 1.2.3

反向引用

反向引用通常用来解决重复性的分组,比如html标签。

const reg = /<(?<tagName>[a-z]+)>(?<content>.*?)<\/\1>/
const matched = '<div>hello</div>'.match(reg)
const { tagName, content } = matched.groups // div hello

\1 表示反向引用前边的第一个分组,

.*? 是说尽可能少的匹配,不然.*把后边的标签也匹配了。

如果用命名的话,可以通过\k<groupName>进行反向引用前边的分组。

const reg = /<(?<tagName>[a-z]+)>(?<content>.*?)<\/\k<tagName>>/

断言

断言又叫零宽断言,表示用来匹配想要匹配到的东西,不会匹配多余的东西。比如匹配价格的时候用来匹配以$开头的数值。

const reg = /(?<=\$)(\d+)/
const matched = '$180'.match(reg)
const price = matched[0] // 180

用来匹配¥结尾的数值

const reg = /(\d+)(?=¥)/
const matched = '180¥'.match(reg)
const price = matched[0] // 180

负向断言的话就是把 = 变成 !,比如后边不是$的数值或者前边不是¥的数值。写法和上边的没什么差距。

嗨,请先 登录

加载中...
(๑>ω<๑) 又是元气满满的一天哟