正则表达式匹配与所匹配域名相关的所有子域名

13

我有一个正则表达式,可以匹配网页子域名,例如以下示例:

 "^https://[^/?]+\\.(sub1|sub2\\.)domain\\.com"

接受domain.com的任何子域名的正则表达式是什么。

编辑:

我的问题不完整,我的正则表达式只接受

 https:[any number of sub domain s ].sub1domain.com 
 https://[any number of sub domain s ].sub2domain.com

抱歉发布不完整的问题。

8个回答

38

这个应该符合您的需求:

https?://([a-z0-9]+[.])*sub[12]domain[.]com

正则表达式可视化


以您测试的方式,URL https://sub1.sub2.sub1domain.com 返回 sub2,而我认为他想要的是 sub1.sub2 - BAD_SEED
@marianoc84 我不明白...你所说的“return”是什么意思? - sp00m
@sp00m 可能是“在 $1 中捕获”。 - AlexR
不错。请记住:子域名中也允许使用“-”,最好转义“/”,并且应以字母开头而非数字。 - stelios
从https://dev59.com/22w05IYBdhLWcg3wpTYV#7111947中看起来,它似乎可以以数字开头。我不明白为什么要转义“/”,这完全取决于您的语言/引擎。关于“-”的好处是:如果需要,可以使用`([a-z0-9]+(?:[a-z0-9-]*[a-z0-9])?[.])*`代替。 - sp00m

3

类似这样:

(http|https)://(.*).domain.com

在这一点上,第二个标签(即\2$2变量)是您所需要的。请注意,这个正则表达式没有验证URL。
证明: https://www.debuggex.com/r/3KYGmAnlnBq3C_fT

谢谢你的答复。你能看一下我更新的问题吗? - Exception
现在进行检查,然后告诉我! - BAD_SEED
3
重要提示:仅当您可以始终信任来源时,才使用此方法。这个答案与像“https://totally.bad.url.com/fake/out.domain.com/”这样的东西不安全地匹配,具体取决于您如何显示它,可能会被用于网络钓鱼。接受的答案不存在这个问题。 - brainbag

3
我假设您不希望子域名仅因数字而不同。请使用以下正则表达式:
(^https:\/\/(?:[\w\-\_]+\.)+(?:subdomain1|subdomain2).com)

单个捕获组是完整的URL。只需将subdomain1和subdomain2替换为您实际的子域名即可。
我在regex101.com上进行了测试。

2
假设子域仅包含数字和小写字母且您不想接受子子域:
[0-9a-z]*\.domain\.com

更新:
https://.*\.sub[1|2]domain\.com

匹配

https://sub1.sub2.sub1domain.com 
https://sub1.sub1domain.com 

但不包括

https://sub1domain.com 

谢谢你的回答。你能看一下我更新的问题吗? - Exception

2

你需要使用

"^https://[^/?]+\\.([^.]+)\\.domain\\.com"

这可以简化为匹配。
"[^.]+"

适用于任何子域名。只匹配子域名的最后一部分(www.xxx.domain.com将在第1组中捕获“xxx”)


谢谢您的回答。您能否请看一下我更新的问题? - Exception

1
尝试使用http://([^.]+\\.)+sub[12]domain.com。一个很好的测试正则表达式的地方是RegexPlanet,它的设置非常简单。

0
这里是一个正则表达式,可以匹配任意数量的子域名,同时允许使用国际化域名,并检查其是否限制在63个字符以内。它还会检查“-”是否不在第一或最后位置。
https?://([a-z0-9](?:[a-z0-9-]{1,61}[a-z0-9])?[.])*sub[12][.]domain[.]com/

0
正则表达式中,起始处的双斜杠 // 需要进行转义处理,正确写法如下:
https?:\/\/([a-z0-9]+[.])*sub[12]domain[.]com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接