如何用正则表达式从URL中提取含单个连字符的指定格式域名?
正则表达式修改建议
核心问题分析
你当前的正则(?<=.)[a-zA-Z0-9]+-[a-zA-Z0-9-_]+存在两个关键问题:
- 未限制仅允许单个连字符,会误匹配含多个连字符的域名(比如
www.florida-miami-dade.com) - 包含下划线匹配规则(
_),但标准域名通常不允许下划线,且你的需求案例中也未涉及
解决方案
根据你的需求,需要确保目标域名恰好包含一个连字符,同时匹配合法的域名结构(字母、数字、点、单个连字符)。以下分两种场景给出正则:
场景1:直接匹配独立域名字符串
如果你输入的是单独的域名(如www.miami-dade.com),使用这个正则:
^(?![^-]*-[^-]*-)[a-zA-Z0-9.]+-[a-zA-Z0-9.]+$
^和$:限定匹配整个字符串,避免部分匹配(?![^-]*-[^-]*-):负向预查,确保字符串中不会出现第二个连字符[a-zA-Z0-9.]+-[a-zA-Z0-9.]+:匹配包含单个连字符的合法域名结构
场景2:从完整URL中提取域名
如果需要从带协议的URL(如https://www.miami-dade.com/path)中提取,使用这个正则:
(?:https?://)?(?![^/]*-[^/]*-)([a-zA-Z0-9.]+-[a-zA-Z0-9.]+)(?=/|$)
(?:https?://)?:可选匹配http/https协议,不捕获该部分(?![^/]*-[^/]*-):确保从当前位置到第一个斜杠/字符串结尾之间,只有一个连字符([a-zA-Z0-9.]+-[a-zA-Z0-9.]+):捕获符合要求的域名部分(?=/|$):确保域名后是路径分隔符或URL结尾,避免误匹配路径内容
测试验证
- 匹配成功:
www.miami-dade.com、miami-dade.gov、sub.miami-dade.co.uk - 匹配失败:
www.miamidade.com(无连字符)、www.florida-miami-dade.com(多个连字符)、miami--dade.com(连续连字符)
内容的提问来源于stack exchange,提问作者YouKnowWhyImHere
相关产品推荐
相关产品推荐

