接口模式都是 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"
仅仅再加个?即可。