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

标签 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.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 个捕获组,这解释了您从 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'))

关于javascript - 在javascript中使用正则表达式提取域名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48846302/

相关文章:

javascript - 遍历jsTree树

javascript - 有没有一个工具可以检查html中脚本的加载顺序

java - 一种计算括号数量而不包括括号内内容的方法

java - 国际电话的正则表达式

Java 正则表达式模式匹配任何字符序列后第一次出现的 “boundary”

javascript - 在 Javascript 中获取 API 返回 [object, object]

javascript - 在js中找到多边形的中心点

javascript - jQuery 手机 : Position of external panel/always visible?

php - 尝试使用 ErrorDocument 处理请求时出现 500 Internal Server Error

javascript - 正则表达式:获取字符之间或字符与行尾之间的字符串