
本文介绍一种高效、可读性强的正则表达式方案,用于从文本段落中精准匹配所有 URL,同时自动排除包含特定域名(如 example.com 及其子域)的链接,支持 HTTP/HTTPS 协议可选、大小写不敏感、并正确处理 Markdown 和纯文本混排场景。
本文介绍一种高效、可读性强的正则表达式方案,用于从文本段落中精准匹配所有 url,同时**自动排除包含特定域名(如 `example.com` 及其子域)的链接**,支持 http/https 协议可选、大小写不敏感、并正确处理 markdown 和纯文本混排场景。
在实际开发中(如内容清洗、外链分析、安全审计或 SEO 工具),我们常需从富文本或纯文本中提取有效外部链接,但必须过滤掉内部域名或白名单站点。例如,给定如下段落:
This is a paragraph name.url.com it contains random urls name-dev.url.com name-qa.url.com [www.example.com](http://www.example.com) test.example.com <http:><http:><https:> test.com</https:></http:></http:>
目标是捕获 name.url.com、name-dev.url.com、
✅ 推荐正则表达式(JavaScript / .NET / Python re 等主流引擎通用):
/(?<h3>✅ 正则解析说明</h3>
| 部分 | 含义 | 作用 |
|---|---|---|
| (? | 负向先行断言:左侧不能是非空白字符 | 确保匹配从单词边界(空格/换行/开头)开始,避免误截取 myexample.com 中的 mple.com |
| (?:https?:\/\/)? | 非捕获组:可选匹配 http:// 或 https:// | 兼容带协议与不带协议的 URL(如 test.com 和 https://test.com) |
| (?:(?!(?i)example)\w+[.-])+ | 核心过滤逻辑:每个标签段(test.、name-dev.)都需满足「不以 example 开头」(忽略大小写) | 精准拦截 example.com、www.example.com、api.example.com、TEST.EXAMPLE.COM 等所有变体 |
| [a-z]{2,11} | 匹配 2–11 位小写字母的顶级域(TLD) | 覆盖 com、org、io、enterprises 等常见 TLD,兼顾扩展性与安全性 |
| (?!\S) | 负向后行断言:右侧不能是非空白字符 | 确保匹配在空格/换行/结尾处终止,防止 example.com/test 被部分匹配 |
? 提示:(?i) 可显式加入以强化大小写不敏感(如 (?i)example),但多数引擎在 /gi 标志下已默认对 example 不敏感;若需更严格控制,建议在代码层统一转小写预处理。
✅ 实际代码示例(C#)
using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;
public static List<string> ExtractUrlsExcludingDomain(string text, string excludedDomain = "example.com")
{
// 构建动态正则:将 excludedDomain 转为小写并转义正则元字符
string escapedDomain = Regex.Escape(excludedDomain.ToLowerInvariant());
string pattern = $@"(?(matches.Cast<match>().Select(m => m.Value.Trim()));
}
// 使用示例
string paragraph = "name.url.com [www.example.com](http://www.example.com) <https:> test.example.com";
var urls = ExtractUrlsExcludingDomain(paragraph);
// 结果:["name.url.com", "TestCaSeSensetivEUrl.com"]</https:></match></string>
⚠️ 注意事项与增强建议
- 不覆盖 URL 中路径部分:本正则仅匹配「域名主体」(含可选协议),不捕获 ?query 或 /path —— 这是设计使然,确保语义清晰、避免过度匹配。
- Markdown 链接兼容性:因使用空白边界断言 (?只提取裸 URL,符合需求。
- 子域过滤可靠性:(?!(?i)example) 作用于每个 . 分隔段,因此 test.example.com 中的 example.com 段会被拒绝,整个域名不匹配 —— 无需额外写 (?
- 性能优化:使用 RegexOptions.Compiled(.NET)或预编译实例,避免重复解析;对超长文本建议配合 Regex.MatchTimeout 防卡死。
- 进阶需求:如需支持 IPv4、国际化域名(IDN)、或保留完整协议+路径,请改用专用 URL 解析库(如 Uri.TryCreate + 白名单校验),正则仅作轻量级预筛。
掌握该正则,你便拥有了一个简洁、健壮、开箱即用的「反向域名过滤 URL 提取器」——无需依赖外部库,一行模式解决典型内容治理场景。











