rfc中是这样定义邮箱格式的:
address = mailbox ; one addressee
/ group ; named list
group = phrase ":" [#mailbox] ";"
mailbox = addr-spec ; simple address
/ phrase route-addr ; name & addr-spec
route-addr = "<" [route] addr-spec ">"
route = 1#("@" domain) ":" ; path-relative
addr-spec = local-part "@" domain ; global address
local-part = word *("." word) ; uninterpreted
; case-preserved
domain = sub-domain *("." sub-domain)
sub-domain = domain-ref / domain-literal
domain-ref = atom ; symbolic reference
感觉说的不是很清楚,在附录中有更详细的说明.尝试了几个流行的邮箱服务商,如:
网易163
=>
用户名只能包含_,英文字母,数字
腾讯邮箱
=>
由英文、数字、点、减号、下划线组成
gmail
=>
只能使用字母 (a-z)、数字 (0-9) 和数点 (.)
yahoo邮箱
=》 4至32个字符(包括字母、数字、下划线),且必须以英文字母开始
每一家的限制都不相同:
看看这个
牛X的正则匹配
的,可以有%,最后需要有2到4个字符作为域名的结尾,但是却没有限制整体的长度:
\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
Options: case insensitive。
呵呵,因为c程序里要用到,于是综合上面各位写了一个c语言校验邮箱地址的函数:
bool IsValidEmail(const char* pszEmail, const char* pszTip)
if(pszEmail == NULL)
return false;
int iAtPos = 0;
int iLastDotPos = 0;
int i = 0;
int iAtTimes = 0;
while(*(pszEmail + i) != ‘\0′)
char ch = *(pszEmail + i);
if(!isprint(ch) || isspace(ch)) //空格和控制字符是非法的,限制得还比较宽松
iAtTimes = 0;
break;
if(ch == ‘@’)
iAtPos = i;
iAtTimes++;
else if(ch == ‘.’)
iLastDotPos = i;
if(i > 64 || iAtPos < 1 || (iLastDotPos – 2) < iAtPos ||
(i – iLastDotPos) < 3 || (i – iLastDotPos) > 5 || iAtTimes > 1 || iAtTimes == 0) //对@以及域名依靠位置来判断,限制长度为64
return false;
return true;
相比网上另外一个版本的校验,性能应该是有所提升的:
bool IsValidEmail(const char *s)
char* ms;
if ((ms=strchr(s,’@')) == NULL)
return false;
if (strchr(ms+1,’@') != NULL)
return false;
if (strchr(ms+1,’.') == NULL)
return false;
if (strchr(s,’.') < ms)
if (strchr(strchr(s,’.')+1,’.') < ms)
return false;
if (strlen(strrchr(s,’.')+1) > 4 || strlen(strrchr(s,’.')+1) < 2)
return false;
return true;
通过运行1000次来计算花费了多少微妙,进行了一下性能上的比较:
validemail1 test //前一种
Time cost => 244(us), avg => 0(us)
validemail2 test //后一种
Time cost => 590(us), avg => 0(us)
总体而言,第一个校验的格式比第二个要好一倍。可见字符串的操作还是比较浪费时间的。
rfc的邮箱格式说明:
http://www.freesoft.org/CIE/RFC/822/61.htm
这个网站不错:
http://www.regular-expressions.info/regexbuddy/email.html
rfc中是这样定义邮箱格式的: address = mailbox ; one addressee / group ; named list group = phrase ":" [#mailbox] ";" mai
要求
:用
户
输入
邮箱
,
验证
邮箱
格式是否正确(
验证
用
户
输入
的
邮箱地址
中
是否含有字符'@')。
目的:掌握
邮箱
验证
控件的原理和方法。
//用
户
邮箱
格式
验证
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20
//声明函数
int checkEmail(char [],int);
Email address book includes two types of email address:
General address, include information:
email address (unique), name, phone number
Group address, include information:
email address (unique), name, list of address(each address may be a general address or a group address).
Write an Email address book management program with C/C++ language:
Give an email address, find its information. If given address is a group address, should list all the general addresses in this group.
Add/Remove one email address.
Read email address book from a source file.
Save email address book to a destination file.
1、标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其
中
最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。
2、C/C++
中
使用正则表达式一般分为三步:
1)编译正则表达式 regcomp()
int regcomp (regex_t *compile
注意
输入
的
字符串
里面可能有空格,所以要nextLine()而不是next(),其他一个个
验证
就好了,@要计算次数,多了少了都不行。
import java.util.Scanner;
public class eMailchecked {
public static void m
ain
(String args[]){
Scanner input=new Scanner(System.in)
pcre *pcre_compile(const char *pattern, int options,
const char **errptr, int *erroffset,
const unsigned char *tableptr);
功能:...