示例4:
[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,6}
由于本人使用的正则表达式测试工具中的\w包含汉字,因此以下面的正则表达式测试:
[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*@(?:[a-zA-Z0-9_-]+\.)+[a-zA-Z]{2,6}
以上二者按理来说是等价的,因为:
\w ≡ [a-zA-Z0-9_]
以上示例用于匹配“电子邮箱”。
一、完整的邮箱名的结构
1.用户定义的邮箱名称:本例中允许字符为[a-zA-Z0-9_-],也就是说不包括汉字,包括字母、数字、下划线、减号连接符,同时,增加了特殊的点号.,点号不允许出现连续的两个及以上;
2.邮箱标志符:@
3.邮箱组织名:允许字符与“邮箱名称”一致,本例中只包括字母、数字、下划线、减号连接符、点号;
4.顶级域名:只允许出现2至6位字母。
二、正则表达式拆解
1.用户定义的邮箱名称
[\w-]+(?:\.[\w-]+)*
或:
[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*
重点在于第二部分的“非捕获性括号”:(?:\.[\w-]+)*,用于匹配邮箱名称中可能出现的点号,因而整个括号外面的量词是:*,表示匹配0个及以上,相当于:{0,},而括号内在匹配完点号后(\.),紧接着匹配非点号字符:[\w-],并且限定其量词是:+,表示至少出现1次,相当于:{1,},这样就排除了点号的连续,以及点号孤零零出现的邮箱名称首尾的情况。
?:表示“非捕获性”,如果对于“子匹配”没有特殊要求,将括号内的子表达式改为非捕获性的,有利于提高正则表达式的匹配效率。
2.邮箱标志符
@
使用普通字符@匹配即可。
3.邮箱组织名
(?:[\w-]+\.)+
或
(?:[a-zA-Z0-9_-]+\.)+
该括号也是非捕获性的,整体结构是:(?:……)+,其后量词+表示至少出现1次,至多不限。括号内的子表达式为:[a-zA-Z0-9_-]+\.,先匹配名称,再匹配点号,点号前的名称是必不可少的。
最后一个点号其实也匹配了:邮箱组织名.顶级域名,中间的分隔点号。
4.顶级域名
[a-zA-Z]{2,6}
只允许出现字母,并且为2到6位。
三、匹配效果
测试工具:
自定义函数:
公式为:
=RegExp(I8,"[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,6}",3,,TRUE,,)
正则表达式自定义函数(原始字符串,正则表达式,匹配模式,替换内容,全局匹配开关,忽视大小写开关,多行搜索开关)
完毕。