我在 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) doesn't capture match
所以,我尝试了一下:
function getDomainsOfEmails(text) {
var domains = /(?:@)[a-z0-9-]+\.[a-z0-9]+/g;
return text.match(domains);
}
但是它continues返回“@”。
我做错了什么?
最佳答案
您可以在要保留的模式部分周围使用捕获组,但您需要使用 exec()
循环中的方法,将捕获的匹配推送到数组。
另一种方法:
function getDomainsOfEmails(text) {
var domains = /@[a-z0-9-]+\.[a-z0-9]+/g
return text.match(domains).map(function(s) { return s.slice(1) })
}
关于javascript - 正则表达式,匹配以@开头的文本,但不带@,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29702499/