我有一堆域名如下:
http://subdomain.example.com(example.com始终是example.com,但子域名不同)。
我需要“子域名”。
有耐心学习正则表达式的某些人可以帮助我吗?
答案 0 :(得分:36)
上述正则表达式的问题在于:如果您不知道协议是什么,或者域名后缀是什么,您将得到一些意想不到的结果。这是针对这些情况的一点正则表达式。 :d
/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i //javascript
这应始终返回组1中的子域(如果存在)。 这是一个Javascript示例,但它也适用于支持正面预见断言的任何其他引擎:
// EXAMPLE of use
var regex = /(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i
, whoKnowsWhatItCouldBe = [
"www.mydomain.com/whatever/my-site" //matches: www
, "mydomain.com"// does not match
, "http://mydomain.com" // does not match
, "https://mydomain.com"// does not match
, "banana.com/somethingelse" // does not match
, "https://banana.com/somethingelse.org" // does not match
, "http://what-ever.mydomain.mu" //matches: what-ever
, "dev-www.thisdomain.com/whatever" // matches: dev-www
, "hot-MamaSitas.SomE_doma-in.au.xxx"//matches: hot-MamaSitas
, "http://hot-MamaSitas.SomE_doma-in.au.xxx" // matches: hot-MamaSitas
, "пуст.пустыня.ru" //even non english chars! Woohoo! matches: пуст
, "пустыня.ru" //does not match
];
// Run a loop and test it out.
for ( var i = 0, length = whoKnowsWhatItCouldBe.length; i < length; i++ ){
var result = whoKnowsWhatItCouldBe[i].match(regex);
if(result != null){
// YAY! We have a match!
} else {
// Boo... No subdomain was found
}
}
答案 1 :(得分:21)
/(http:\/\/)?(([^.]+)\.)?domain\.com/
然后$ 3(或\ 3)将包含“subdomain”(如果有的话)。
如果你想在第一组中拥有子域名,那么你的子域名 正则表达式引擎支持非捕获组(害羞组),使用 这是由palindrom建议的:
/(?:http:\/\/)?(?:([^.]+)\.)?domain\.com/
答案 2 :(得分:4)
纯粹是子域名字符串(结果为$ 1):
^http://([^.]+)\.domain\.com
使http://
可选(结果为$ 2):
^(http://)?([^.]+)\.domain\.com
使http://
和子域可选(结果为$ 3):
(http://)?(([^.]+)\.)?domain\.com
答案 3 :(得分:2)
应该只是
\Qhttp://\E(\w+)\.domain\.com
子域名将是第一组。
答案 4 :(得分:0)
#!/usr/bin/perl
use strict;
use warnings;
my $s = 'http://subdomain.example.com';
my $subdomain = (split qr{/{2}|\.}, $s)[1];
print "'$subdomain'\n";
答案 5 :(得分:0)
对于其中带有点字符的数学子域,我使用了这个
https?:\/\/?(?:([^*]+)\.)?domain\.com
获取协议后直到域的所有匹配字符。
https://sub.sub.domain.com(子) ...
答案 6 :(得分:-1)
第一组
http://(.*).example.com