总结了那么多,正式进入激动的操练吧
练习一
场景是,比如写一个后端接受到前端返回的错误上报数据,可以拿到当前的referrer,但是我们想要匹配出是那个页面的路由报的错,这时候:
——目标匹配出referrer中的路由
referrer大概张这个样子
"https://ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0"
我们想要得到是是 /hd/group_lottery
骚做分析斜杆 / 应该是关键,但是这里的 :// 给匹配过程造成了巨大的痛点,与其写一大堆排除他的代码,不如直接用slice截掉
从左到右进行匹配分析
- 第一步 slice截掉 ://
var referrer = "[https://ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0](https://ymobile-cn.ankerjiedian.com/hd/group_lottery?label=grinch&utm_source=share&from=timeline&isappinstalled=0)"
var newReferrer = referrer.split("://")[1] ? referrer.split("://")[1] : referrer.split("://")[0]
- 第二步
匹配一个斜杆/,因为后面的斜杆都要,所以后面的字符用.匹配 ,是0到多次,就是.+,
再看,我们不需要匹配出路由参数,就是不要问号及后面的东西
直接上结果把
const routes = newReferrer.match(/\/(?!\/)[^?]+/g);
返回 /hd/group_lottery
两个斜杆中间的是正则匹配代码,/正则/
匹配一个斜杆需要转译 所以是 /
/(?!/) 就是匹配一个斜杆,并且后面不是斜杆,
[^?] 然后在匹配一个不是?的字符
[^?]+ 再对这个字符进行0到多次匹配
g就是全局匹配的意思
完成
练习二
这是我在网上抄的一个比较有意思的例子
目标:查找一个具有6位字符的,含有“cat”的单词。
解决一
排列组合法,排列出所有可能的位置:
cat\w{3}|\wcat\w{2}|\w{2}cat\w|\w{3}cat
非常蠢,但是对简单的还是很实用,
解决二
是我们需要一个6位的字符,二是单词含有“cat”。
那我们就想匹配出一个6位字符;
用单词边界 \b,和向前位置匹配
\w是匹配单词的意思
就是匹配一个单词边界后面是6个单词的字符串;\b\w{6}\b
\b\wcat\w\b,匹配一个cat,前后是长度为0到多个的一个单词;
(?=\b\w{6}\b)\b\w*cat\w*\b
简化
\b(?=\w{6}\b)\w{0,3}cat\w*
\b(?=\w{6}\b)就是匹配一个长度为6的单词,主要这是只是位置匹配,还没有匹配任何字符,对后面单词起约束作用
\w{0,3}cat\w*
\w{0,3}匹配一个长度是0到3的单词,比如没有,或者q,qq,qqq都可以
然后是匹配一个cat
然后后面又是匹配一个长度0到多次的单词,以为前面\b(?=\w{6}\b) 已经进行约束,所以这里最近用*匹配就可以了
最后
好了以后我遇到有意思的匹配练习再补充吧
参考博客,极力推荐
深入浅出之正则表达式
网友评论