求助:正则匹配非标准TLD域名时表达式匹配全部内容
你的正则问题分析与修复方案
首先,咱们来拆解你遇到的问题:你想用正则匹配非标准TLD(不是.com/.net/.org)的域名/URL,但当前的正则.*(?<!\.(?:com|net|org)\/)把整个测试链接都匹配了,核心问题出在断言的位置和匹配逻辑的定位错误。
为什么你的正则会匹配全部内容?
你的正则逻辑是:“匹配任意字符,直到某个位置,该位置的前面没有.com/、.net/或.org/”。但你的测试链接http://www.spam-link.br/getmoneyhere.php的末尾是.php,字符串结尾的位置前面根本不存在.com/这类后缀,所以.*会直接匹配从开头到结尾的所有内容——完全没起到筛选域名后缀的作用。
你真正需要检查的是域名部分的结尾,而不是整个URL的结尾位置。
修复后的正则方案
根据你的需求(匹配包含非标准TLD域名的完整URL),可以用这个正则:
^https?://[^/]+(?<!\.com)(?<!\.net)(?<!\.org)/?.*$
逐段解释:
^https?://:匹配URL开头的http://或https://(如果需要支持其他协议,比如ftp,可以改成[a-z]+://)[^/]+:精准匹配域名部分——直到遇到第一个/(域名和路径的分隔符)(?<!\.com)(?<!\.net)(?<!\.org):三个负后向断言,确保域名的结尾不是.com、.net或.org/?.*$:匹配域名后可选的/,以及后续的所有路径内容(比如/getmoneyhere.php),直到字符串结束
测试验证
- 对于你的测试链接
http://www.spam-link.br/getmoneyhere.php:域名是www.spam-link.br,后缀是.br,符合非标准TLD,会被完整匹配。 - 如果是
http://example.com/page.php:域名结尾是.com,断言不满足,不会被匹配。
如果你只想提取域名部分
可以用带捕获组的正则,捕获组1就是目标域名:
https?://([^/]+(?<!\.com)(?<!\.net)(?<!\.org))
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

