在javascript中使用正则表达式提取域名

在javascript中使用正则表达式提取域名,javascript,regex,Javascript,Regex,我有一个域名列表,例如developer.mozilla.org。我只需要提取域名,例如mozilla.org。我使用了RegExp,但到目前为止没有正确使用它。不知道我错过了什么 我写了这个javascript,它没有准确地捕获我想要的部分 var arr = ["developer.mozilla.org", "cdn.mdn.mozilla.net", "www.google-analytics.com", "www.youtube.com"]; var arrLength = arr.l

我有一个域名列表,例如developer.mozilla.org。我只需要提取域名,例如mozilla.org。我使用了RegExp,但到目前为止没有正确使用它。不知道我错过了什么

我写了这个javascript,它没有准确地捕获我想要的部分

var arr = ["developer.mozilla.org", "cdn.mdn.mozilla.net", "www.google-analytics.com", "www.youtube.com"];
var arrLength = arr.length;
var reg = new RegExp('((\\.[a-zA-Z0-9]+)(\\.[a-zA-Z0-9]+))$');

for (i=0; i< arrLength; i++)
{
    console.log(arr[i].match(reg))
}

如果您按照以下方式编写代码,它将起作用:

var arr = ["developer.mozilla.org", "cdn.mdn.mozilla.net", "www.google-analytics.com", "www.youtube.com"];
var arrLength = arr.length;
var reg = /[^.]+\.[^.]+$/

for (i=0; i< arrLength; i++)
{
    console.log(arr[i].match(reg)[0])
}
您编写的正则表达式有2个捕获组,这解释了您从console.log获得的阵列

['.mozilla.org', '.mozilla', '.org'] = [matching string, capturedGroup1, capturedGroup2]
通过这样编写正则表达式,您可以使您的组不被捕获:

var reg = new RegExp('(?:(?:\\.[a-zA-Z0-9]+)(?:\\.[a-zA-Z0-9]+))$');
或者使用@Bergi建议的正则表达式文字

var reg = /(?:(?:\.[a-zA-Z0-9]+)(?:\.[a-zA-Z0-9]+))$/
在任何情况下,当您使用match方法时,您将得到一个数组作为回报,您真正感兴趣的是匹配的字符串,因此数组中的第一个元素。通过像这样重写循环体,可以得到预期的结果

console.log((arr[i].match(reg) || [])[0]) // note I'm concerned with string.match returning null here
如果您确实不喜欢该数组,可以使用字符串替换

console.log(arr[i].replace(/^.*\.([^.]+\.[^.]+)$/, '$1'))
\w将拾取下划线和连字符。第一个元素上的子字符串1,因此不打印第一个点:

let arr = ["developer.mozilla.org", "cdn.mdn.mozilla.net", 
    "www.google-analytics.com", "www.youtube.com"];
let expr = /(\.[\/\w\.-]+)(\.[a-zA-Z0-9]+)/;
let regex = new RegExp(expr);

arr.forEach(e => console.log(e.match(regex)[0].substring(1)));

对于这个简单的任务,您不需要正则表达式

var arr = ["developer.mozilla.org", "cdn.mdn.mozilla.net", "www.google-analytics.com", "www.youtube.com"];
var arrLength = arr.length;
for (var i = 0; i < arrLength; i++)
{
    var parts = arr[i].split('.');
    var domain = parts.slice(-2).join('.');
    console.log(domain);
}
或者更简短的版本:

for (var i = 0; i < arr.length; i++)
{
    var domainName = arr[i].split('.').slice(-2).join('.');
    console.log(domainName);
}

slice-2提取数组序列中的最后两个元素。

不要对常量表达式使用RegExp构造函数,而是使用regex文本。为什么要使用regex?我认为这可以解决你的问题,甚至可以解决更多的问题。你为什么需要使用新的regexpxpr?
for (var i = 0; i < arr.length; i++)
{
    var domainName = arr[i].split('.').slice(-2).join('.');
    console.log(domainName);
}