DanLevy.net

从零到正则高手

用一个正则提取并解析类 URL 字符串

目录

太长不看版: 直接跳到 120+ 字节正则部分

🚀 引言

从原始文本中提取 URL 有时就像在玩一场乏味的“打地鼠”游戏。标点符号、括号嵌套以及各种模棱两可的格式都会挫败你的努力。无论你是在构建网络爬虫、数据分析器还是聊天应用,准确提取 URL 都是刚需。

在这篇文章中,我们将通过一种灵活的两步走方案来正面解决这个问题。我们的目标是:先捕获所有“疑似”URL 的字符串,然后在后续流程中处理验证逻辑。

💡 注意: 此模式并非用于 验证 URL!它对标点符号和拼写错误具有刻意的容错性(Permissive)。

🔍 目标:从文本中提取 URL

在处理原始文本提取时,两步走方案非常有效:

  1. 捕获所有疑似 URL:撒大网,抓取所有可能是 URL 的字符串。这就是我们这个“120+ 字节正则”大显身手的地方。
  2. 验证:一旦捕获了这些候选对象,再通过二次检查(例如 DNS 解析、与已知域名比对)来剔除无效条目。

挑战可视化

“提取(Extract)”和“解析(Parse)”这两个词经常被混用,但它们代表了不同的过程。提取 URL 是指从大段文本中识别并捕获潜在的 URL;而解析则是将这些 URL 拆解为各个组成部分。

当我提到解析或“URL 组成部分”时,我指的是以下组件:

URL 的 5 个组成部分
URL 结构可视化

点击查看 RegEx101 子字符串匹配的截图。

在深入研究正则之前,让我们先用可视化工具看看这个模式捕获多个匹配项的效果:

使用 RegEx101.com 可视化多行匹配
预览批量多行匹配

🛳️ 这个 120+ 字节的正则

下面是一个简洁的正则表达式,旨在一次性完成 URL 的提取和解析。它支持各种协议、域名、路径以及可选的查询参数/片段部分。

别担心——我们会一步步拆解它!

120+ 字节 URL 正则表达式
const urlRegex = /([-.a-z0-9]+:\/{1,3})([^-\/\.[\](|)\s?][^`\/\s\]?]+)([-_a-z0-9!@$%^&*()=+;/~\.]*)[?]?([^#\s`?]*)[#]?([^#\s'"`\.,!]*)/gi;
// 兼容性:ES5+
// 同样的模式,为了可读性按行拆分:
([-.a-z0-9]+:\/{1,3})
([^-\/\.[\](|)\s?][^`\/\s\]?]+)
([-_a-z0-9!@$%^&*()=+;/~\.]*)
[?]?([^#\s`?]*)
[#]?([^#\s'"`\.,!]*)
下方评论区分享你遇到过(或编写过)的最狂野的正则!🚀

🧩 逐步拆解

让我们将这个正则分解为各个组件,以了解其工作原理:

1. 协议 (Group 1): ([-.a-z0-9]+:/{1,3})

2. 域名 (Group 2): ([^-/.[](|)s?][^`/s]?]+)

3. 路径 (Group 3): ([-_a-z0-9!@$%^&*()=+;/~\.]*)

4. 查询参数 (Group 4): [?]?([^#\s`?]*)

5. 片段 (Group 5): [#]?([^#\s’”`.,!]*)

🛠️ 解析示例

下面是如何利用这段复杂的正则表达式,配合一点 JavaScript 代码来完成工作的示例:

☑️ 后续步骤

根据你的具体用例,你可能需要微调此正则,或者增加更多的验证和后处理步骤。

不同项目,不同需求

不同项目对 URL 的要求和安全考量各不相同:

  1. 网络爬虫:验证 URL 以确保其可访问且可信。
  2. 数据处理:从用户生成的内容中提取 URL,同时确保安全性。
  3. 数据分析:过滤掉重复或无关的链接,用于研究或营销目的。
  4. 面向用户的应用:在聊天应用或论坛中自动为 URL 添加超链接。

后处理与验证

在收集到潜在的 URL 后,应进行额外的检查:

📝 总结

提取半结构化的字符串数据,或许是掌握正则表达式过程中最有成就感的部分。

以下是关键要点回顾:

通过遵循这些步骤,你可以有效地提取任何半结构化字符串数据,为进一步的处理和验证打下基础。

📚 延伸学习