我有一个域名列表,例如developer.mozilla.org
。我只需要提取域名,例如mozilla.org
。我使用了RegExp
,但到目前为止还没有正确处理。不知道我想念什么。
我写了这个javaScript,该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])
}
一些解释:
首先,您的正则有一个缺陷,这会导致" Google-Analytics"条目遗漏。我可能会建议您这样写于这样的正则
var reg = /[^.]+.[^.]+$/
您所写的正则截距有2个捕获组,这说明了您从控制台获得的阵列
['.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
将获得下划线和连字符。第一个元素上的substring(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)
在数组序列中提取最后两个元素。