在完全RFC 822标准的正则表达式是低效的和模糊的,因为它的长度。幸运的是,RFC 822被取代了两次,目前的电子邮件地址规范是RFC 5322。RFC 5322导致正则表达式,如果研究几分钟并且对于实际使用而言足够有效,则可以理解该正则表达式。
一个符合RFC 5322标准的正则表达式可以在/的页面顶部找到,但是使用在互联网上浮动的IP地址模式,其中包含允许00任何无符号字节十进制值的错误。以点分隔的地址,这是非法的。其余部分似乎与RFC 5322语法一致,并通过多个测试使用grep -Po,包括案例域名,IP地址,坏名称和带引号和不带引号的帐户名称。
纠正00IP模式中的错误,我们获得了一个工作且相当快速的正则表达式。(为实际代码刮取渲染版本,而不是降价。)(:[A-Z0-9#$%& '* + / = ^ _`{|}〜 - +(?!\ [A-Z0-9#$%&!]'?* + / ?= ^ _`{|}〜 - ] +)* |“(?:[\ x01- \ X08 \ X0B \ X0C \ x0e- \ X1F \ X21 \ x23- \ x5b \ x5d- \ 0x7F部分] | \\ [\ x01- \ X09 \ X0B \ X0C \ x0e- \ 0x7F部分])*“)@(:(:[α-Z0-9](:???[A-Z0-9 - ] * [A-Z0 ?-9])\)+ [A-Z0-9](:?[A-Z0-9 - ] * [A-Z0-9])| \ [(:( :( 2(5'? [0-5] | [0-4] [0-9])| 1 [0-9] [0-9] |。[1-9] [0-9]))\){3}( ?:( 2(5 [0-5] | [0-4] [0-9])| 1 [0-9] [0-9] | [1-9] [0-9])|〔 A-Z0-9 - ] * [A-Z0-9]:(?:[\ x01- \ X08 \ X0B \ X0C \ x0e- \ X1F \ x21- \ X5A \ x53- \ 0x7F部分] | \\ [\ x01- \ X09 \ X0B \ X0C \ x0e- \ 0x7F部分])+)\])
这是上面的regexp的有限状态机图,它比regexp本身更清晰
Perl和PCRE中更复杂的模式(例如在PHP中使用的正则表达式库)可以正确地解析RFC 5322。Python和C#也可以这样做,但它们使用与前两个不同的语法。但是,如果您被迫使用许多功能较弱的模式匹配语言之一,那么最好使用真正的解析器。
同样重要的是要理解,根据RFC验证它绝对不会告诉您该地址是否实际存在于提供的域中,或者输入该地址的人是否是其真正的所有者。人们一直以这种方式签署其他人到邮件列表。修复需要更高级的验证,该验证涉及向该地址发送包含确认令牌的消息,该确认令牌意味着在与该地址相同的网页上输入。
确认令牌是了解您获得进入该人的地址的唯一方式。这就是为什么现在大多数邮件列表都使用该机制来确认注册。毕竟,任何人都可以放下president@whitehouse.gov,甚至可以解析为合法,但不太可能是另一端的人。
对于PHP,你应该不使用给定的模式验证与PHP的电子邮件地址,正道从我引述如下:存在一些危险,即普通使用和广泛的草率编码将为电子邮件地址建立事实上的标准,其比记录的正式标准更具限制性。
这并不比所有其他非RFC模式更好。它甚至不是足够聪明,甚至处理RFC 822,更不用说RFC 5322这一个,但是,是。
如果你想得到花哨和迂腐,实现一个完整的状态引擎。正则表达式只能作为基本过滤器。正则表达式的问题在于告诉某人他们完全有效的电子邮件地址是无效的(误报)因为正则表达式无法处理它只是从用户的角度来看是粗鲁和不礼貌的。用于此目的的状态引擎可以验证甚至纠正否则将被视为无效的电子邮件地址,因为它根据每个RFC反汇编电子邮件地址。这样可以带来更愉悦的体验,例如指定的电子邮件地址“myemail @ address,com”无效。你的意思是'myemail@'吗?
如果觉得《python使用正则验证电子邮件_如何使用正则表达式验证电子邮件地址?》对你有帮助,请点赞、收藏,并留下你的观点哦!