所以,我有这个JavaScript函数:
ME.Utils = {
RxEmail: new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i),
ValidateEmail: function(email) {
return ME.Utils.RxEmail.test(email);
},
GetEmailAddresses: function(text) {
return text.match(ME.Utils.RxEmail);
},
HasEmail: function(text) {
return ME.Utils.GetEmailAddresses != null;
}
};
ValidateEmail
效果很好。但是,HasEmail
和GetEmailAddresses
无效。
GetEmailAdresses
始终返回null
,但字符串仅包含电子邮件地址时除外。在这种情况下,GetEmailAdresses
返回的数组不仅包含电子邮件地址,还包含电子邮件地址(test@test.com),只是id(测试)加上一些未识别的等等...
你能帮我弄清楚我的表情有什么不对吗?
答案 0 :(得分:4)
有一些问题。
您的正则表达式锚定在字符串的开头和结尾。您应该从中删除^
和$
个字符。
如果您只想返回电子邮件地址,请使用非捕获组。
在HasEmail()
中,您没有致电GetEmailAddresses()
。您实际上正在检查是否已定义该属性的值。
总而言之,固定版本可能如下所示:
ME.Utils = {
RxEmail: /(?:(?:"[\w-\s]+")|(?:[\w-]+(?:\.[\w-]+)*)|(?:"[\w-\s]+")(?:[\w-]+(?:\.[\w-]+)*))(?:@(?:(?:[\w-]+\.)*\w[\w-]{0,66})\.(?:[a-z]{2,6}(?:?:\.[a-z]{2})?))|(?:@\[?(?:(?:25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?)/gi,
ValidateEmail: function(email) {
// We can't do a simple test() since we're using an unanchored regex now.
var match = ME.Utils.RxEmail.match(email);
return match.length == 1 && match[0] == email;
},
GetEmailAddresses: function(text) {
return text.match(ME.Utils.RxEmail);
},
HasEmail: function(text) {
return ME.Utils.GetEmailAddresses(text) != null;
}
};
答案 1 :(得分:2)
你的正则表达式专门匹配整个字符串
RxEmail: new RegExp(/^ ... $)/i),
^和$分别匹配输入的开始和结束。尝试删除这些字符,看看你是如何进行的?
答案 2 :(得分:1)
if (emailMatch = ME.Utils.GetEmailAddresses(myEmail))
// do stuff with emailMatch[1]
答案 3 :(得分:1)
当您使用电子邮件地址呈现数组中的多个条目时,您的表达式中包含捕获组。在Javascript中,匹配的结果是一个数组,其中索引0是匹配的总字符串,然后(每个捕获组)有(可选)附加索引。您可以将群组从(...)
更改为(?:...)
。
至于为什么在使用GetEmailAddresses
字符串包含电子邮件地址时,您没有得到预期结果,请尝试以下方法:
GetEmailAddresses: function(text) {
var rv = [];
var match;
while (match = ME.Utils.RxEmail.exec(text)) {
rv.push(match[0]);
}
return rv.length == 0 ? null : rv;
},
请参阅此question and answer,我不能说我知道为什么 String#match
与上面的RegExp#exec
循环不完全相同,但它不是“T
修改您还需要修复oedo pointed out的问题;需要允许RegExp匹配子串。