今早地铁上看到sh.cn的域名。
昨天写的不能匹配。
今天调整:^[\w-\.]{2,25}\@[\w-]{2,35}(?:(?:\.(?:com|net|org|gov))|(?:\.[a-z]{2}(?=\.cn)))?\.(?:com|cn|mobi|tel|asia|net|org|name|me|tv|cc|hk|biz|info)$
共享一下。好久没上csdn发帖了。
昨天写的不能匹配。
今天调整:^[\w-\.]{2,25}\@[\w-]{2,35}(?:(?:\.(?:com|net|org|gov))|(?:\.[a-z]{2}(?=\.cn)))?\.(?:com|cn|mobi|tel|asia|net|org|name|me|tv|cc|hk|biz|info)$
共享一下。好久没上csdn发帖了。
([\w.\d-]{2})@(?>[\w\d-]+\.)+[\w-]{2}
如果必要,下午解释一下。^[\w-\.]{2,25}\@[\w-]{2,35}(?:(?:\.(?:com|org|gov)(?=\.cn))|(?:\.[a-z]{2}(?=\.cn))|(?:\.(?:net)(?!\.)))?\.(?:com|cn|mobi|tel|asia|net|org|name|me|tv|cc|hk|biz|info)$^
[\w-\.]{2,25}
\@
[\w-]{2,35}
(?:
(?:\.(?:com|org|gov)(?=\.cn))
|
(?:\.[a-z]{2}(?=\.cn)
)
|
(?:\.(?:net))
)?
\.(?:com|cn|mobi|tel|asia|net|org|name|me|tv|cc|hk|biz|info)
$
看前面的过滤条件。格式太松散了。
不过我也没说明我写的牛逼在哪里,,呵呵。
我就是尽可能的限定其格式,保证其有效性;比如 domain.net.cn。这个域名是无效的,它就不能匹配。
而library.sh.cn/lib.com.cn都是可能有效的,需要匹配。
写该正则的出发点:
在群发邮件时,我们往往无法确认收件人地址是否有效。为提高邮件发送的成功率,筛选无效的地址是比较重要的。普通的邮箱的格式:
[email protected]
[email protected] //可理解为".ext0"是可能没有的分析该正则之前需了解:(XXX代表其他特定的字符、组织结构)
(?:XXX),和(XXX)没太多区别,只是匹配而不捕获。
(?!XXX),反向匹配。 如Win(?!95|98|NT|2000) 匹配 Win xp 中的 Win,注意:xp不包括
(?=XXX),正向匹配。 如Win(?=95|98|NT|2000) 匹配 Win95, Win98, WinNT, Win2000 中的 Win。
^[\w-\.]{2,25}\@[\w-]{2,35}(?:(?:\.(?:com|org|gov)(?=\.cn))|(?:\.[a-z]{2}(?=\.cn))|(?:\.(?:net)(?!\.)))?\.(?:com|cn|mobi|tel|asia|net|org|name|me|tv|cc|hk|biz|info)$
^
[\w-\.]{2,25} //不能以'_'开头未设限
\@ //
[\w-]{2,35} //
(?: //ext0段如果有:
(?:\.(?:com|org|gov)(?=\.cn)) //必须是com,org,gov中的一个,并且后面跟cn
| //或
(?:\.[a-z]{2}(?=\.cn)) //两个字符的ext0,后面跟cn。
| ////这两行应该删除。
(?:\.(?:net)(?!\.)) ////这两行应该删除,写错了。拆解出来才发现,呵呵。
)? //ext0段结束
\.(?:com|cn|mobi|tel|asia|net|org|name|me|tv|cc|hk|biz|info) //最后要以com,cn,...等结尾。
$按照这个方法,如果把所有域名后缀列表都取到并加以分析。就可以写出能过滤标准后缀域名地址的分析正则。记得以前有看到过,正则的效率往往和长度成反比。 所以一般越长的越臭,非必要,尽可能写短。
邮箱的规则是可以自定义的,比如通用规则允许邮箱名中带“'”,但是如果我申请个域名,架个邮件服务器,我就是不允许注册带“'”的邮件,这也是完全可以的,因为规格由我来定
规则不定,正则自然也不确定,只有根据实际需求写出的正则才是合理的
这也是一种常见的误解,在匹配<...>标签时,以下哪个正则的效率高?
<.*?>
<[^>]*>
<(?>[^>]*)> 我遇到的很多说正则效率低的问题,真正的问题不是出在正则上,而是出在写正则的人上
就你说的三情况。
尽管我无法看到正则匹配的执行过程,
但我肯定
<.*> -- 删你一个"?"
<[^>]*>
<(?>[^>]*)>
第一个效率是最高的。
这种情况就不可以。
:D(悄悄地说)学了正则,常常会换个思路看问题的。经常是想偷懒。:)准备考RHCE.最近在研究Linux;grep里也用正则。;-)
源字符串为<a...>...<b...>时,如果要求匹配的是<a...>而不是<a...>...<b...>时,需要使用非贪婪模式<.*?>,而不能使用贪婪模式<.*?>对于同一个源字符串,匹配失败的情况下
<.*?>和<[^>]*>
是没有什么区别的
而匹配成功的情况下,<[^>]*>的匹配效率更高对于同一个源字符串,匹配成功的情况下
<[^>]*>和<(?>[^>]*)>
是没有什么区别的
而匹配失败的情况下,<(?>[^>]*)>的匹配效率更高对于同一个源字符串,无论是匹配成功,还是匹配失败
<(?>[^>]*)>的匹配效率都要高于<.*?>不要说什么<.*>和<.*?>的问题,因为它们的应用场景本就不同
如果都可以匹配到正确结果的情况下,匹配失败的情况下,效率上没什么区别,匹配成功情况下,<.*>的效率更高
由于操作系统版本的不同,所提供的grep的版本可能也是千差万别
虽然都叫grep,但是现在的grep怕不是有几十甚至数百个版本了
而每一个操作系统都不会对自己提供的grep所支持的元字符以及语法做过多说明的
所以通常除了常规的一些元字符和语法,想清楚一个grep支持的元字符各语法范围通常是很困难的
我以前遇到一个问题,在js文件中用正则"\d"好像不行,要使用字符簇"[0-9]"代替。不知何故?
最近也在琢磨这事。
LZ你的正则也可以匹配以下状况[email protected]; [email protected]
但是[email protected]和[email protected]为什么不让匹配?
域名中不含有“_”但是Email中@之前字符串可以的。
\w包括0-9 不需要[\w\d-]这么写;
有个原则,能不用正则最好不用;原因就是正则效率问题,尽管很牛B;
例如在PHP中,很多函数可以实现的问题,最好不要用;