我正在创建一种新方法,我正在努力确保我的逻辑正确以及我如何阅读我在这里写的内容。
$.validator.addMethod('checkDomain', function (value) {
if(/^([\w-.]+@(?!gmail\.com)(?!yahoo\.com)(?!hotmail\.com)(?!test\.com)([\w-]+.)+[\w-]{2,4})?$/.test(value)) {
return false; // FAIL validation when REGEX matches
}
else {
return true; // PASS validation otherwise
}
}, 'Please provide a business email.');
我在这里要说的是,如果电子邮件地址与gmail匹配,例如设置为false,因为我们不希望这样。虽然当我把它设置为假时,它是倒退的。我的正则表达式了吗?如果它与其中一个电子邮件域匹配,是否会返回true?
方法test()返回一个布尔值,你可以将if else缩短为只返回一个返回语句。
你的正则表达式包含在一个可选的组()?
中,所以空字符串也会匹配。
如果您不需要捕获组,您可以将此部分([\w-]+.)+
更改为(?:[\w-]+\.)+
并转义点。
您可以将正则表达式更新为:
^[\w-.]+@(?!(?:(?:hot|g)mail|yahoo|test)\.com)(?:[\w-]+\.)+\w{2,4}$
例如,如果电子邮件地址匹配了@符号之后的任何gmail等,它将返回true:
$.validator.addMethod('checkDomain', function (value) {
return !/^[\w-.]+@(?!(?:(?:hot|g)mail|yahoo|test)\.com)(?:[\w-]+\.)+\w{2,4}$/.test(value);
}, 'Please provide a business email.');
function checkDomain(value) {
return !/^[\w-.]+@(?!(?:(?:hot|g)mail|yahoo|test)\.com)(?:[\w-]+\.)+\w{2,4}$/.test(value);
}
const strings = [
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
];
strings.forEach(s => console.log(`${s}: ${checkDomain(s)}`));
说明
^
字符串的开头[\w-.]+
匹配单词字符,连字符或点之一的1倍以上@
字面意思匹配(?!
负面预测检查以下内容不是
(?:(?:hot|g)mail|yahoo|test)\.com
非捕获组与交替)
关闭否定前瞻(?:[\w-]+\.)+
重复匹配一个单词字符或连字符后跟一个点的1+倍\.\w{2,4}
匹配一个点和2-4个字符$
字符串结尾