V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
wikinee
V2EX  ›  JavaScript

关于不固定邮箱 @之后的“.”的正则表达式

  •  
  •   wikinee · 2015-10-22 11:26:45 +08:00 · 5885 次点击
    这是一个创建于 3354 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在学习 JS ,遇到一个问题。教程里关于邮箱正则表达式都是哪种单点的。
    针对复合域名,比如 [email protected] 这样的如何过滤,如果不知道输入的邮箱是有一个“.”两个“.”的如何写啊
    -----------
    目前我只想到 xxx.[com|cn|net|us]这种固定写法
    36 条回复    2015-11-02 19:11:06 +08:00
    wikinee
        1
    wikinee  
    OP
       2015-10-22 11:29:24 +08:00
    附上我以前讨论 a.b.c.txt 和 a.b.tar.gz 文件名提取的帖子
    http://v2ex.com/t/222982#reply14
    FrankFang128
        2
    FrankFang128  
       2015-10-22 11:31:03 +08:00
    有 @ 就过吧,别为难你的用户。
    你只支持 .com .cn .net .us 邮箱是啥意思啊。

    ([^.]+\.)+.[com|cn|net|us]
    FrankFang128
        3
    FrankFang128  
       2015-10-22 11:31:46 +08:00
    ([^.]+\.)+\.[com|cn|net|us]
    都怪你误导无了……
    Hello1995
        4
    Hello1995  
       2015-10-22 11:49:02 +08:00 via Android
    \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

    考虑一下域名以及用户名的字符限定以及首字符限定,这么写应该能通吃。
    wkdhf233
        5
    wkdhf233  
       2015-10-22 11:55:05 +08:00   ❤️ 1
    判断邮箱格式是否正确的话,后面有\w\.\w 就给过了吧
    二级域名不止多个.啊,有的还有-呢。。
    est
        6
    est  
       2015-10-22 12:20:46 +08:00
    最好的办法是解析域名 MX 记录,连一下 25 端口。
    gamexg
        7
    gamexg  
       2015-10-22 12:58:27 +08:00 via Android
    @est 直接发验证邮件完了。
    vitovan
        8
    vitovan  
       2015-10-22 13:02:23 +08:00
    [A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}
    Clarencep
        9
    Clarencep  
       2015-10-22 13:17:54 +08:00
    @gamexg +1

    验证邮箱大法好
    不想验证就取出 @后面的域名,解析下 dns 吧

    没必要限制域名
    gamexg
        10
    gamexg  
       2015-10-22 13:28:51 +08:00
    还有正则里面 . 是可以匹配 char(.) 的。
    别难为用户了,,有 @ 有 . 就行了。

    [^@]+@[^@]+\.[^@]+
    lygmqkl
        11
    lygmqkl  
       2015-10-22 13:30:37 +08:00
    [email protected] 代表邮箱,然后验证邮箱就行了。
    raysonx
        12
    raysonx  
       2015-10-22 13:37:11 +08:00
    表示我认识的圈子里有好多 [email protected] 的邮箱,看来楼主是不打算支持了
    flydogs
        13
    flydogs  
       2015-10-22 13:48:19 +08:00
    @ 后面 xxx.xxx 就可以过了。
    不管字母数字还是中文什么的。
    branchzero
        14
    branchzero  
       2015-10-22 13:51:04 +08:00
    域名不一定是 com|cn|net|us 结尾的说,最好还是按照 2-10 位的字母来写正则吧。
    fengdra
        15
    fengdra  
       2015-10-22 14:21:55 +08:00 via iPhone   ❤️ 1
    @vitovan 钻个牛角尖, [email protected]
    zonghua
        16
    zonghua  
       2015-10-22 14:23:06 +08:00
    不要尝试校验域名。

    @branchzero 域名是还可以用 - 的
    branchzero
        17
    branchzero  
       2015-10-22 14:26:18 +08:00
    @zonghua 额,我是说后缀,不是域名主体部分=。=
    zonghua
        18
    zonghua  
       2015-10-22 14:31:16 +08:00
    @branchzero 好吧,我看错了= =.
    jugelizi
        19
    jugelizi  
       2015-10-22 14:47:58 +08:00
    你这验证的目的?
    我记得有些必须 edu 给学生用的
    不然的话发验证到邮箱就解决啦,前端的验证没必要太过吧,会坑人的
    lililqth
        20
    lililqth  
       2015-10-22 15:18:52 +08:00
    \w+@(\w+.)+[com|cn|net|us]
    Slienc7
        21
    Slienc7  
       2015-10-22 19:58:52 +08:00 via Android
    [A-Za-z0-9]+?[A-Za-z0-9\.\-]*?[A-Za-z0-9]+@[A-Za-z0-9]+?[A-Za-z0-9\.\-]*?[A-Za-z0-9]+
    手写未测试 域名后缀一直增加 不可能固定 前后都可能非首末位- .
    Slienc7
        22
    Slienc7  
       2015-10-22 20:01:41 +08:00 via Android
    @xgowex 举个例子 aasa-sss.high.ffgg-fcuf@fcg-hgc.cgg-gvc.xn--hhuuh
    注意:实际-.不可能相连 上面的 re 没有考虑到
    可能中文邮箱,此处不做考虑
    sss3barry
        23
    sss3barry  
       2015-10-22 23:54:05 +08:00
    我们学校学生的邮箱 @mail.scut.edu.cn
    第一次看到直接惊呆,域名这么长
    jings
        24
    jings  
       2015-10-23 00:06:22 +08:00
    function isEmail(field){
    return field.value.indexOf("@") !=-1&&field.value.indexOf(".") !=-1
    }
    KoleHank
        25
    KoleHank  
       2015-10-23 08:07:14 +08:00
    据说最新标准 xxx@xxx 是合法的邮箱了,怎么办?
    virusdefender
        26
    virusdefender  
       2015-10-23 08:35:53 +08:00
    django 匹配邮箱的正则,你可以参考,这个都标准了吧


    def validate(self, value):
    value = super(EmailField, self).validate(value)
    user_regex = re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*$"
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"$)',
    re.IGNORECASE)
    domain_regex = re.compile(
    r'(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}|[A-Z0-9-]{2,}(?<!-))$'
    # literal form, ipv4 address (SMTP 4.1.3)
    r'|^\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]$',
    re.IGNORECASE)
    domain_whitelist = ['localhost']
    if '@' not in value:
    raise ValidationError("Email format is not correct")

    user_part, domain_part = value.rsplit('@', 1)

    if not user_regex.match(user_part):
    raise ValidationError("Email format is not correct")

    if (domain_part not in domain_whitelist and
    not domain_regex.match(domain_part)):
    # Try for possible IDN domain-part
    try:
    domain_part = domain_part.encode('idna').decode('ascii')
    if not domain_regex.match(domain_part):
    raise ValidationError("Email format is not correct")
    else:
    return
    except UnicodeError:
    pass
    raise ValidationError("Invalid Email format")
    return value
    hxndg
        28
    hxndg  
       2015-10-23 09:18:52 +08:00
    \w+@\w+(\.\w+)*\.[com|cn|net|us]
    hxndg
        29
    hxndg  
       2015-10-23 09:26:52 +08:00
    leaving the enviroment,all comment is nonesense
    zhhc
        30
    zhhc  
       2015-10-23 09:35:10 +08:00
    你们先试试能否匹配 [email protected] 不是我钻牛角尖
    aksoft
        31
    aksoft  
       2015-10-23 10:27:47 +08:00
    解析 @后面的,匹配有个求用
    18000rpm
        32
    18000rpm  
       2015-11-02 12:31:35 +08:00   ❤️ 1
    小声问一句,
    [com|cn|net|us] 这种是什么用法?看你们全都这么用,我 Google 了半天也没找到这种语法。

    P.S. 我觉得是不是应该用圆括号 (com|cn|net|us)

    @FrankFang128
    @lililqth
    @hxndg
    hxndg
        33
    hxndg  
       2015-11-02 12:56:31 +08:00
    @18000rpm ...嗯,你可以直接搜索正则表达式大括号。用百度
    hxndg
        34
    hxndg  
       2015-11-02 12:57:27 +08:00
    @18000rpm ps 括号一般两个作用,一个是做文本匹配,另一个是调整优先级
    FrankFang128
        35
    FrankFang128  
       2015-11-02 13:17:55 +08:00 via Android
    @18000rpm 你是对的 我被楼主带沟里了
    hxndg
        36
    hxndg  
       2015-11-02 19:11:06 +08:00
    @18000rpm sorry ,又想了一下,错了。应该是整体的备选。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3606 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:28 · PVG 12:28 · LAX 20:28 · JFK 23:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.