【问题标题】:Regex to match simple domain正则表达式匹配简单域
【发布时间】:2020-08-15 13:17:39
【问题描述】:

我正在尝试匹配一个简单的域:example.com

但它的所有组合。

我将如何做到这一点:

https://example.com http://www.example.com 等等

【问题讨论】:

  • 您必须使用单个正则表达式吗?使用现有的 URL 解析器,然后单独查看各个部分将不太容易出错。
  • @muistooshort 原来我有/^https?:\/\/.*?\.?facebook\.com\// 但认为它可能不适用于所有情况?
  • 这会让一些无效的网址通过(例如http://a_b.facebook.com/),但这可能不是问题。
  • 你尝试了什么?你有什么问题值得你尝试。这不是教程网站,也不是免费的代码编写服务。请阅读*.com/help/how-to-ask,然后编辑您的 Q 以使其符合 SO 旨在处理的 Q 类型。

标签: regex pattern-matching


【解决方案1】:
^https?://([\w\d]+\.)?example\.com$

使用代码:

var result = /^https?:\/\/([a-zA-Z\d-]+\.){0,}example\.com$/.test('https://example.com');
// result is either true of false

我改进了它以匹配“http://a.b.example.com”

【讨论】:

  • 您可能需要调整该字符类别。并非所有\w 在域名中都有效(尤其是_)并且允许使用连字符
  • @itea - 谢谢 - 但你能为我添加 javascript 转义吗?
  • @itea 再次感谢您的帮助 - 但我仍然有问题。见jsfiddle.net/v4WVU
  • @Andy 因为 $match 字符串/行的结尾,所以只需将其删除。使用这个: if (/^(?:http(?:s)?:\/\/)?(?:[^\.]+\.)?jsfiddle\.net/.test(window.location.href )) { alert('works'); } // 这似乎在 jsfiddle 中不起作用,但在 chrome javascript 控制台中起作用。
  • 您好!虽然此代码可能会解决问题,但包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请编辑您的答案以添加解释并说明适用的限制和假设。如果 Q 已被回答,则应在 cmets 中写入指向该 SO 帖子的链接,或将帖子报告为重复,而不是重新回答 SO 以按设计运行
【解决方案2】:

您可能可以使用来匹配 URL 的域名部分:

/^(?:https?:\/\/)?(?:[^.]+\.)?example\.com(\/.*)?$

它将匹配以下任何字符串:

https://example.com
http://www.example.com
http://example.com
https://example.com
www.example.com
example.com

 

RegEx Demo

正则表达式详细信息:

  • ^:开始
  • (?:https?:\/\/)?:匹配 http://https://
  • (?:[^.]+\.)?可选匹配文本直到紧接下一个点和点
  • example\.com:匹配example.com
  • (\/.*)?可选匹配/,后跟0个或多个任意字符
  • $:结束

【讨论】:

  • 实际上它可以工作,请参阅:jsfiddle.net/v4WVU/3 你试图匹配location.href,即http://fiddle.jshell.net/_display/。正如我在上面写的,RegEx 用于匹配域名而不是完整的 URL。
  • 您好!虽然此代码可能会解决问题,但包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。如果 Q 已被回答,则应在 cmets 中写入指向该 SO 帖子的链接,或将帖子报告为重复,而不是重新回答 SO 以按设计运行
  • 非常有效的观点@SherylHohman,很抱歉在我发布此内容时没有添加解释。我现在在我的答案中添加了一个工作演示和解释。谢谢!
【解决方案3】:

我使用的更通用的示例:

/http(?:s)?:\/\/(?:[\w-]+\.)*([\w-]{1,63})(?:\.(?:\w{3}|\w{2}))(?:$|\/)/i

请注意,此解决方案不会为 5 个字符的 TLD 选择正确的标签。示例:

http://mylabel.co.uk

会被选为“co”而不是“mylabel”,但是

http://mylabel.co

将被正确匹配为“mylabel”。即使有这个限制,正则表达式对我来说已经足够好了。

请注意,标签的 63 个字符限制是 RFC 规范。希望这对以后寻找相同答案的人有所帮助。

【讨论】:

    【解决方案4】:

    以下工作在Java中,

    ^(http:|https:|)[/][/]([^/]+[.])*example.com$

    匹配你的测试用例,匹配

    之类的用例

    http://www.google.com/http://example.com

    【讨论】:

      【解决方案5】:

      这将正确匹配以下任何变体的 URL,以及 .com 之后的任何内容

      https://example.com
      https://www.example.com
      http://www.example.com
      http://example.com
      https://example.com
      www.example.com
      example.com
      

      结果为真或假

      const result = /^(http(s)?(:\/\/))?(www\.)?example\.com(\/.*)?$/.test(value); 
      

      【讨论】:

        【解决方案6】:

        下面的 exp 匹配第一部分中的 http/htpps/ftp,虽然它也可以匹配随机的 5 个字母单词,如 ahfzc,但很少会出现大小写和它们将被 exp 的后面部分忽略

        第二部分匹配 www/www,最后一部分匹配任何由“.”分隔的字母数字。最后一部分匹配任何 3 个字符,如 .com、.in、.org 等。

        试试这个

        r'[a-z0-9]{0,5}[\:\/]+[w]{0,3}[\.]+[a-z0-9\-]+[\.]+[a-z0-9]{0,3}'
        

        【讨论】:

        • 您好!虽然此代码可能会解决问题,但包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。如果 Q 已被回答,则应在 cmets 中写入指向该 SO 帖子的链接,或将帖子报告为重复,而不是重新回答 SO 以按设计运行
        • 您的正则表达式匹配:://:://...-...,而不是有效域。但它与有效的*.comexample.enterprise 不匹配。
        • 正确我们可以使用它来包含 *.com domain_exp = r'[a-z0-9]{0,5}[\:\/]?[w]{0,3}[\.]?[a-z0-9\-]+[\.]+[a-z0-9]{0,3}' 但这会使其过于笼统并包含大量误报。您将不得不根据您获得的数据类型调整您的解决方案,因为我相信您无法获得 100% 的准确度。就我而言,上述方法效果最好。