有意思的正则-待继续整理

接口模式都是 https://xxx/a/b/c/eee.do , 要过滤出里面的接口名ddd,别人写的:
(/([^/.]+)(?:.do)?$/g).exec('https://xxx/a/b/c/eee.do') 虽然可以过滤出名称 eee,但是碰到接口名带点的就不行,如https://xxx/a/b/c/ddd.eee.do 就只能得到 eee 而不能得到想要的 ddd.eee。

下面是改造探索试过的几个方法:
1, (/([^/]+)(?:.do)?$/).exec('https://xxx/a/b/c/ddd.eee.do')
简单去掉前面[]中的点,想让它不包含点,结果: "ddd.eee.do", "ddd.eee.do" 两个都包含了.do

2, (/([^/.do]+)(?:.do)?$/).exec('https://xxx/a/b/c/ddd.eee.do') 前面看能否去掉.do,不成样子了。

3,分析1的结果,为啥第二个匹配仍然是ddd.eee.do?有可能还没走到后面的自匹配(?:.do),这个是不捕获的,看起来整个应该要没有.do,但现在又有.do,那显然是没走到那里,而是 'https://xxx/a/b/c/ddd.eee.do' 就满足了(/([^/]+) 的匹配,字符就被前面的匹配吃掉了【匹配会消耗字符是正则的特性】,
试验验证这个猜想:(/([^/]+)$/).exec('https://xxx/a/b/c/ddd.eee.do') 果然和1的结果一模一样。

4, 经过3想到有没有尽量少的匹配不把.do匹配在第一个匹配里的方法呢?(防被吃),立马想到非贪婪模式:?
(/([^/]+?)(?:.do)?$/).exec('https://xxx/a/b/c/ddd.eee.do') 才能得到想要的: "ddd.eee.do", "ddd.eee"
仅仅再加个?即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值