JavaScript正则匹配URL:如何排除无关部分捕获指定内容?
刚好碰到过类似的正则捕获问题,针对你给出的URL https://api.example.com/main/user1/collection1/contents/folder1/test.js,我来帮你搞定这两个需求:
1. 仅捕获collection1
你之前用的(?:/user1/)[^/]*之所以会返回包含user1的结果,是因为这个正则的整个匹配内容是/user1/collection1——非捕获组(?:/user1/)只是不会把/user1/作为单独的捕获组,但它仍然是匹配结果的一部分。
这里有两种靠谱的解决方案:
方案一:用正向回顾后发断言直接匹配目标内容
断言可以帮我们指定“前面必须是某个内容”,但断言本身不会被包含在最终匹配结果里:(?<=/user1/)[^/]+这个正则的逻辑是:匹配前面紧跟着
/user1/的、由非斜杠字符组成的字符串,最终匹配结果就是纯纯的collection1。方案二:用捕获组提取目标内容
把你需要的部分单独放在捕获组里,之后只提取这个组的内容就行:/user1/([^/]+)此时整个正则会匹配
/user1/collection1,但第一个捕获组(对应$1或\1,具体取决于你用的工具)的内容就是collection1,直接取这个组的值就好。
2. 仅捕获folder1/test.js
同理,你之前的contents/(.*)$匹配的是contents/folder1/test.js,整个结果包含了contents/,所以需要把这部分排除掉。
对应的解决方案:
方案一:用正向回顾后发断言
同样利用断言定位到contents/之后,直接匹配后面的所有内容:(?<=contents/).*$这个正则会匹配
contents/之后直到URL结尾的所有内容,结果就是folder1/test.js。方案二:用捕获组提取
把目标部分放在捕获组里,提取组内容即可:contents/(.*)$整个正则匹配
contents/folder1/test.js,第一个捕获组的内容就是folder1/test.js,直接提取这个组的值就搞定了。
内容的提问来源于stack exchange,提问作者jj008

