正则表达式URL捕获组

3
我正在编写一个正则表达式,尝试将URL的每个部分放入不同的捕获组中以进行提取:
  • 协议 (http,https)
  • 子域名 (sub)
  • 域名 (domain)
  • 域名扩展名 (com,net)
  • 路径 (/path/to/file - 这是文件所在目录的路径)
  • URI (文件名)
  • URI扩展名 (文件扩展名 - js,css,pdf)

示例URL:

http://domain.com/path1/to/file.js
http://domain.com/path-dash/to-dash/file.js
http://domain.com/path-dash/to-dash/file-name.js
https://sub.domain.com/path/to/file.js
http://sub.domain-dash.net/path/to/file.js
http://sub-dash.domain.com/path/to/file.js
http://sub-dash.domain-dash.com/path/to/file.js

我目前的内容如下:

所拥有的:

/(https?):\/\/(\w+[\-]?\w+)?.?(\w+[\-]?\w+)?/gm

预期输出:

  • 第一组:协议
  • 第二组:子域(如果有的话,或者为空)
  • 第三组:域名
  • 第四组:域名扩展名
  • 第五组:目录路径
  • 第六组:文件名
  • 第七组:文件扩展名

问题:如何将每个URL部分分别放入自己的捕获组中,覆盖我列举的所有示例?


你使用的是什么编程语言? - davidhu
比我(或许你)更优秀的程序员也曾为同样的问题苦思冥想 - 对于 PHP 可以使用 parse-url(),而对于 C,可以参考这篇文章:https://dev59.com/-XRB5IYBdhLWcg3wFz4g。 - Jan
@Jan 我将使用C语言(抱歉没有标记它,我现在会这样做)。但是我甚至不知道那个PHP函数,但很好知道,我大多数应用程序都是用PHP编写的。 - user7892649
@WiktorStribiżew我查了,但没有看到有处理示例中列表中的所有不同可能的URL格式的方法。 - user7892649
@WiktorStribiżew 我的意思是我喜欢 sscanf() 函数的工作方式,我肯定会使用它,但我仍然需要将模式提取到我上面列出的捕获组中。 - user7892649
显示剩余3条评论
1个回答

2
你可以使用https://regex101.com/来检查分组编号。
如果你关心这些编号,你总是可以使用 "非捕获组(?:)"。
(https?):\/\/(?:([\w-]+)\.)?([\w-]+)\.(\w+)((?:\/[\w-]+)*\/)([\w-]+)+\.([\w]+)

这样,你就可以确保获得:

第一组:协议

第二组:子域名

第三组:域名

第四组:域名扩展(TLD)

第五组:路径

第六组:文件名

第七组:扩展名


如果拥有额外的分组无关紧要,那么使用以下表达式:

/(https?):\/\/(([\w-]+)\.)?([\w-]+)\.(\w+)((\/[\w-]+)*\/)([\w-]+)+\.([\w]+)/

你将获得以下内容:

第一组:协议

第三组:子域名

第四组:域名

第五组:顶级域名(或者你所说的域名扩展名)

第六组:/路径/到/

第八组:文件名

第九组:扩展名


它只匹配了第一个URL示例,而且没有在特定的捕获组中返回正确的URL部分。 - user7892649
  1. 协议
  2. 子程序
  3. 域名
  4. 域名扩展名
  5. 目录路径
  6. 文件名
  7. 文件扩展名
- user7892649
也可以使用(com|net),但我真正想要的是一种通用的方法来获取域名扩展名,以便无论在路径(/)之间有什么(com、net、co等),都能够获取到。 - user7892649
好的!你能修改它,使其仅返回目录路径中的“/path/to/”(即删除文件名)吗? - user7892649
我已经修复了 (com|net),你可以直接替换为 (\w+),因为它会在路径开头的 () 处停止。 - user7892649
您很厉害,我找到了我需要的最后一部分。如果您想将其添加到答案中,请使用以下代码:/(https?):\/\/(?:([\w-]+)\.)?([\w-]+)\.(\w+)((?:\/[\w-]+)*\/)([\w-]+)+\.([\w]+)/gm - user7892649

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接