根据 RFC5321/RFC5322 对电子邮件地址进行正则表达式验证

2023-12-31

有谁知道根据以下内容验证电子邮件地址的正则表达式RFC5321 https://www.rfc-editor.org/rfc/rfc5321/RFC5322 https://www.rfc-editor.org/rfc/rfc5322?

由于(可嵌套)注释使语法变得不规则,因此仅应考虑没有注释的地址。

当然,如果您有兴趣验证某人实际拥有的地址,那么唯一真正的验证是将电子邮件发送到该地址并检查所有者是否收到它。然而,我纯粹对 RFC 标准感兴趣。实用的方法这个问题 https://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address更相关。

除了评论之外,我愿意牺牲折叠空白,但除此之外,我对拒绝任何 RFC5321/2 有效地址的表达式不感兴趣。 (可以说,在某些情况下忽略折叠空白甚至是有意义的。)

理想情况下,正则表达式会拒绝任何notRFC 有效,但这不太重要。例如,在正则表达式中包含详尽的顶级域列表并不是那么有趣。只需接受任何顶级域名就足够了。

我不确定地址标签是否(例如[电子邮件受保护] /cdn-cgi/l/email-protection)是我提到的 RFC 的一部分,但我希望正则表达式来验证这些。

IPv6 绝对应该得到正确处理(RFC5952 https://www.rfc-editor.org/rfc/rfc5952).

据我了解国际化电子邮件(RFC6530 https://www.rfc-editor.org/rfc/rfc6530, RFC6531 https://www.rfc-editor.org/rfc/rfc6531, RFC6532 https://www.rfc-editor.org/rfc/rfc6532, RFC6533 https://www.rfc-editor.org/rfc/rfc6533)仍处于实验阶段,但验证这些地址的表达式也很有趣。

为了使答案普遍有趣,如果正则表达式采用 POSIX 格式就好了。


可嵌套的注释使电子邮件地址的语法变得不规则(与上下文无关)。但是,如果您排除注释,则生成的语法是常规的。主要定义允许(折叠)词汇标记之间的空格(例如a @ b.com)。删除所有折叠空白会产生规范形式。

这是根据 RFC 5322 的规范电子邮件地址的正则表达式(排除注释):

([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|\[[\t -Z^-~]*])

如果您需要接受折叠空白,那么这是根据 RFC 5322 的电子邮件地址的正则表达式(不包括注释):

((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?)@((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?)

RFC 5321 (SMTP) 进一步限制了有效电子邮件地址。它基本上保留@符号之前的部分,但仅接受@符号之后的主机名或地址文字。 (“---.---”是有效的点原子,但不是有效的主机名,“[...]”是有效的域文字,但不是有效的地址文字。)

当涉及到主机名和 IP 地址时,RFC 5321 中提供的语法过于宽松。我冒昧地“纠正”了有问题的规则,使用这个草案 https://tools.ietf.org/id/draft-main-ipaddr-text-rep-01.txt and RFC 1034 https://www.rfc-editor.org/rfc/rfc1034(第 3.5 节)作为指导方针。这是生成的正则表达式。

([!#-'*+/-9=?A-Z^-~-]+(\.[!#-'*+/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

所有正则表达式都是 POSIX ERE。最后一个使用负前瞻。看here https://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address/14075810#14075810用于正则表达式的推导。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据 RFC5321/RFC5322 对电子邮件地址进行正则表达式验证 的相关文章

  • 从字符串向量中删除方括号

    我有一个字符向量 其中每个元素都括在括号中 我想 去掉括号 只剩下字符串 所以我尝试 n c Dave Tony Sara paste n sep 不幸的是 由于某种原因这不起作用 在使用相同的代码之前我已经执行了相同的任务 并且不确定为什
  • RewriteEngine On .htaccess 不起作用

    我正在尝试提出我的请求如何处理这样的文件 r login 但有像index php这样的服务器吗 r login 我正在使用的 htaccess 代码似乎不起作用 Options FollowSymLinks RewriteEngine O
  • 时间:2019-03-17 标签:c#regexmatchesexample

    我试图从以下文本中获取值 如何使用正则表达式来完成此操作 Input Lorem ipsum dolor sat download 456 amet consectetur adipiscing download 3434 elit Dui
  • 使用 re.findall 获取第一个匹配项,无需访问任何 Python 代码

    我试图在 Python 3 7 中通过使用正则表达式提取元素来识别 pdf 文档中的模式 我遇到的问题与我只需要正则表达式的第一个匹配这一事实有关 然而 当我占用我的正则表达式时 它会找到两者 FECHA DE EMISION 26 03
  • Jquery:表单验证不起作用

    我对 Jquery 很陌生 希望你们能帮助我解决这个 jquery 验证问题 一直在尝试验证表单 但它根本没有验证 它接受我在字段中输入的任何内容 无论我设置什么限制 请帮忙 谢谢 这是我的代码
  • 正则表达式仅匹配大写“单词”,但有一些例外

    我的技术字符串如下 The thing P1 must connect to the J236 thing in the Foo position 我想用正则表达式匹配那些仅大写的单词 即这里P1 and J236 问题是当句子的第一个字母
  • 正则表达式中的 ^.* 和 .*$ 是什么?

    谁能解释一下这些字符的含义 我查过它们 但我似乎不明白 整个正则表达式是 8 a z A Z 所以基本上是正则表达式的开始和结束字符 意思是 任何字符 意思是 任何数量的这个 因此意味着任意长度的任意字符串 表示字符串的开头 表示字符串的结
  • AWK 中多行的匹配正则表达式。 && 操作员?

    我不确定 运算符在正则表达式中是否有效 我想做的是匹配一行 使其以数字开头并具有字母 a 下一行以数字开头并具有字母 b 并且下一行 字母 c 该 abc 序列将用作开始读取文件的唯一标识符 这就是我在 awk 中想要的东西 0 9 a n
  • Groovy:验证 JSON 字符串

    我需要检查 Groovy 中的字符串是否为有效的 JSON 我的第一个想法就是把它发送出去new JsonSlurper parseText myString 并且 如果没有例外 就假设它是正确的 然而 我发现 Groovy 很乐意接受尾随
  • 设计 DFA 接受可被数字“n”整除的二进制字符串

    我需要学习如何设计一个 DFA 使得给定任何数字 n 它接受二进制字符串 0 1 其十进制等效数可被 n 整除 不同的 n 会有不同的 DFA 但是有人可以给出一个基本方法 我应该遵循该方法来处理任何数字 0 下面我写了一个答案n等于 5
  • XRegExp 没有后视功能?

    我需要在JavaScript中使用正则表达式的lookbehind 所以发现在 JavaScript 中模拟lookbehind 第 2 步 https gist github com slevithan 2387872 另外 我发现作者
  • 需要一个数字或一个非字母数字字符的密码正则表达式

    我正在寻找一个相当具体的正则表达式 我几乎有了它 但还不完全有 我想要一个至少需要 5 个字符的正则表达式 其中至少有一个字符是either一个数值or非字母数字字符 这是我到目前为止所拥有的 d a z 5 20 所以问题出在 或 部分
  • “通用”电话号码的基本正则表达式

    我需要一个正则表达式 用于 ASP NET 网站 来验证电话号码 它应该是灵活的 唯一的限制是 应至少为 9 位数字 没有字母 可以包含空格 连字符 单个 我搜索过 SO 和 Regexlib com 但我得到的表达式有更多限制 例如英国电
  • 正则表达式会减慢程序速度

    我正在尝试创建一个程序来解析游戏聊天日志中的数据 到目前为止 我已经设法让程序运行并解析我想要的数据 但我的问题是程序变得越来越慢 目前解析 10MB 文本文件需要 5 秒 我注意到如果我将 RegexOptions Compiled 添加
  • Java:正则表达式,其中每个字符出现0-1次

    Problem 匹配正则表达式的每个字符最多出现一次的单词 该单词必须具有一定的大小 例如 2 5 单词中必须有一个特定的字符 比方说字符 e 我有什么 word matches abcde 2 5 这将匹配字符 a b c d 和 e 出
  • 如何使用 SQL 查询在 Access 中的字段上设置验证规则?

    我正在使用 MS Access 2016 Office 365 目前遇到问题 下面是一个演示此问题的示例 这里我创建了一个表 名为节点家庭链接 由两个字段组成 NodeID 和 FamilyID 如下所示 现在 NodeID 是从另一个表
  • 使用 javascript 将多行、缩进的 json 转换为单行

    我想出了以下函数 用于将多行 缩进的 json 转换为单行 function text var outerRX s n r g innerRX s n r return text replace outerRX function 0 1 r
  • 至少 6 个字符正则表达式 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找至少检查 6 个字符的正则
  • 使用 Minitest 测试自定义验证器

    我有多个带有电子邮件验证的模型 因此 我将验证提取到自定义验证器中 我按照以下教程做到了这一点导轨指南 http guides rubyonrails org active record validations html custom va
  • 正则表达式接受 4 条规则中的 3 条

    我似乎无法让正则表达式正确满足以下要求 长度在 8 到 20 之间的字符串 必须包含至少 1 个大写字母字符 至少 1 个小写字母字符 以及至少 1 个数字或至少 1 个特殊字符字符 或两者 假设特殊字符仅限于包括 我最初是这样写的 A Z

随机推荐