四时宝库

程序员的知识宝库

正则表达式学习之拆解示例4

示例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,,)

正则表达式自定义函数(原始字符串,正则表达式,匹配模式,替换内容,全局匹配开关,忽视大小写开关,多行搜索开关)

完毕。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接