今早地铁上看到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发帖了。

解决方案 »

  1.   


    ([\w.\d-]{2})@(?>[\w\d-]+\.)+[\w-]{2}
      

  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)
    $
      

  3.   

    According to http://www.regular-expressions.info/email.html, RFC 2822 says:(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
      

  4.   


    看前面的过滤条件。格式太松散了。
    不过我也没说明我写的牛逼在哪里,,呵呵。
    我就是尽可能的限定其格式,保证其有效性;比如 domain.net.cn。这个域名是无效的,它就不能匹配。
    而library.sh.cn/lib.com.cn都是可能有效的,需要匹配。
      

  5.   


    写该正则的出发点: 
    在群发邮件时,我们往往无法确认收件人地址是否有效。为提高邮件发送的成功率,筛选无效的地址是比较重要的。普通的邮箱的格式:
    [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,...等结尾。
    $按照这个方法,如果把所有域名后缀列表都取到并加以分析。就可以写出能过滤标准后缀域名地址的分析正则。记得以前有看到过,正则的效率往往和长度成反比。 所以一般越长的越臭,非必要,尽可能写短。
      

  6.   

    早上就看到这帖子,不想做过多的评论[email protected]也是存在的,记得很久以前注册过这个域名的邮箱,难不成每见到一个合理的域名就去更新一下正则表达式?
    邮箱的规则是可以自定义的,比如通用规则允许邮箱名中带“'”,但是如果我申请个域名,架个邮件服务器,我就是不允许注册带“'”的邮件,这也是完全可以的,因为规格由我来定
    规则不定,正则自然也不确定,只有根据实际需求写出的正则才是合理的
      

  7.   


    这也是一种常见的误解,在匹配<...>标签时,以下哪个正则的效率高?
    <.*?> 
    <[^>]*> 
    <(?>[^>]*)> 我遇到的很多说正则效率低的问题,真正的问题不是出在正则上,而是出在写正则的人上
      

  8.   


    就你说的三情况。
    尽管我无法看到正则匹配的执行过程,
    但我肯定
    <.*>     -- 删你一个"?"
    <[^>]*>
    <(?>[^>]*)>
    第一个效率是最高的。
      

  9.   

    [email protected]
    这种情况就不可以。
      

  10.   

    正则有客客在。我赶紧低调一点,悄悄飘过。
    :D(悄悄地说)学了正则,常常会换个思路看问题的。经常是想偷懒。:)准备考RHCE.最近在研究Linux;grep里也用正则。;-)
      

  11.   


    源字符串为<a...>...<b...>时,如果要求匹配的是<a...>而不是<a...>...<b...>时,需要使用非贪婪模式<.*?>,而不能使用贪婪模式<.*?>对于同一个源字符串,匹配失败的情况下
    <.*?>和<[^>]*>
    是没有什么区别的
    而匹配成功的情况下,<[^>]*>的匹配效率更高对于同一个源字符串,匹配成功的情况下
    <[^>]*>和<(?>[^>]*)>
    是没有什么区别的
    而匹配失败的情况下,<(?>[^>]*)>的匹配效率更高对于同一个源字符串,无论是匹配成功,还是匹配失败
    <(?>[^>]*)>的匹配效率都要高于<.*?>不要说什么<.*>和<.*?>的问题,因为它们的应用场景本就不同
    如果都可以匹配到正确结果的情况下,匹配失败的情况下,效率上没什么区别,匹配成功情况下,<.*>的效率更高
      

  12.   


    由于操作系统版本的不同,所提供的grep的版本可能也是千差万别
    虽然都叫grep,但是现在的grep怕不是有几十甚至数百个版本了
    而每一个操作系统都不会对自己提供的grep所支持的元字符以及语法做过多说明的
    所以通常除了常规的一些元字符和语法,想清楚一个grep支持的元字符各语法范围通常是很困难的
      

  13.   

    jf
    我以前遇到一个问题,在js文件中用正则"\d"好像不行,要使用字符簇"[0-9]"代替。不知何故?
      

  14.   

    OREILLY的《精通正则表达式》,从零开始,按书上的内容边打边理解。一定会有收获的
      

  15.   


    最近也在琢磨这事。
    LZ你的正则也可以匹配以下状况[email protected][email protected]
    但是[email protected][email protected]为什么不让匹配?
    域名中不含有“_”但是Email中@之前字符串可以的。
      

  16.   


    \w包括0-9 不需要[\w\d-]这么写;
      

  17.   


    有个原则,能不用正则最好不用;原因就是正则效率问题,尽管很牛B;
    例如在PHP中,很多函数可以实现的问题,最好不要用;