我在codecademy学习正则表达式,在上一次练习中我需要创建 getDomainsOfEmails()函数。
...和我got this:
function getDomainsOfEmails(text) {
var domains = /@[a-z0-9-]+\.[a-z0-9]+/g;
return text.match(domains);
}
但理想情况下,该函数应返回没有' @':
的域var emails = "";
emails += "washington.guedes@gmail.com ";
emails += "guedes@outlook.com ";
emails += "wg100@ig.com.br ";
console.log ( getDomainsOfEmails (emails));
我用循环解决了它:
function getDomainsOfEmails(text) {
var domains = /@[a-z0-9_.]+\.[a-z0-9]+/g;
var arr = text.match(domains);
for (var i=0, l=arr.length; i<l; i++) {
arr[i] = arr[i].substring(1);
}
return arr;
}
但我不喜欢我的方法,并且阅读SO's Regex-wiki我发现了关于模式分隔符的这条指令:
(?:pattern)没有捕获匹配
所以,我试过了:
function getDomainsOfEmails(text) {
var domains = /(?:@)[a-z0-9-]+\.[a-z0-9]+/g;
return text.match(domains);
}
但它continues返回了&#39; @&#39;。
我做错了什么?
答案 0 :(得分:2)
您可以在要保留的模式部分周围使用捕获组,但是您需要在循环中使用exec()
方法,将捕获的匹配项推送到数组。
另一种方法可以做到这一点:
function getDomainsOfEmails(text) {
var domains = /@[a-z0-9-]+\.[a-z0-9]+/g
return text.match(domains).map(function(s) { return s.slice(1) })
}
答案 1 :(得分:0)
使用x(?=y)
规则来说明&#34;匹配&#39; x&#39;只有当&#39; x&#39;之后是&#39; y。这被称为前瞻&#34;使用*允许在@之后允许更多匹配,然后获得所有a-z A-Z。 - 字符,直到找到空格/s
。
var emails = "";
emails += "washington.guedes@gmail.com ";
emails += "guedes@outlook.com ";
emails += "wg100@ig.com.br ";
var re = /(?=@*)([a-zA-Z.-]+\s)/g;
console.log(re.exec(emails));
&#13;