正则表达式,匹配以@开头的文本,但不要带@

时间:2015-04-17 14:48:53

标签: javascript regex

我在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;。

我做错了什么?

2 个答案:

答案 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) })
}

eval.in

答案 1 :(得分:0)

使用x(?=y)规则来说明&#34;匹配&#39; x&#39;只有当&#39; x&#39;之后是&#39; y。这被称为前瞻&#34;使用*允许在@之后允许更多匹配,然后获得所有a-z A-Z。 - 字符,直到找到空格/s

&#13;
&#13;
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;
&#13;
&#13;