【问题标题】:Regex URL Capturing Group正则表达式 URL 捕获组
【发布时间】:2017-01-30 05:50:57
【问题描述】:

我正在编写一个正则表达式并尝试将 URL 的每个部分放入它自己的捕获组中以进行提取:

  • 协议 (http,https)
  • 子域 (子)
  • (域)
  • 域名扩展 (com,net)
  • 路径 (/path/to/file - 这是文件所在目录的路径)
  • URI (文件名)
  • URI 扩展名 (文件扩展名 - js、css、pdf)

示例网址:

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

所需的输出:

  • Group1: 协议
  • Group2: 子域(如果存在,如果不存在,则为空白)
  • Group3:
  • Group4: 域扩展
  • Group5:目录路径
  • Group6: 文件名
  • Group7: 文件扩展名

问题:如何在上面列出的所有示例中将每个 URL 部分放入它自己的捕获组

【问题讨论】:

  • 你使用什么语言?
  • 您可能正在重新发明轮子,因为大多数语言都提供了足够的内置方法来解析 URL。
  • 比我更好的程序员(也许还有你)对完全相同的问题感到困惑——例如,使用parse-url() 代替PHP。对于Cstackoverflow.com/questions/726122/…
  • @davidhu2000 语言是 C。
  • @Jan 我将使用 C(抱歉没有标记它,我现在就做)。但我什至不知道那个 PHP 函数,但很高兴知道,我确实用 PHP 编写了大部分应用程序。

标签: c regex capture-group


【解决方案1】:

您可以使用https://regex101.com/查看组号。

如果您确实关心数字,您可以随时使用“非捕获组 (?:)

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

这样你确实会得到

第一组:协议

组 2. 子域

组 3. 域

第 4 组。域扩展 (TLD)

第 5 组。/path/to/

第 6 组。文件名

第 7 组。扩展


如果有额外的小组不会打扰你,那么

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

你会得到

第一组:协议

组 3. 子域

组 4. 域

第 5 组。顶级域(或如您所说的域扩展)

第 6 组。/path/to/

第 8 组。文件名

第 9 组。扩展

【讨论】:

  • 它只匹配第一个 URL 示例,它也没有返回特定捕获组中 url 的正确部分。
  • 1.协议 2. sub 3.domain 4.domain-extension 5.directory path 6.file name 7.file-extension
  • (com|net) 也可以工作,但我真正想要的是一种通用的方式来获取域扩展,所以不管那个 (.) 和开头 (/) 之间是什么路径(com、net、co 等)。
  • 不错!您可以将其修改为仅返回 /path/to/ 作为目录路径(因此删除文件名)
  • 我已经修复了(com|net),您可以将其替换为(\w+),因为它将在路径开头的 () 处停止。
猜你喜欢
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多