此电子邮件验证正则表达式中不可打印控制字符的用途是什么?

2024-02-27

背景资料

我们使用 SonarQube 来获取有关代码库的质量指标。根据规则,SonarQube 在我们的 Node.js 代码库中标记了十多个错误S6324 https://rules.sonarsource.com/javascript/RSPEC-6324,与 Google 排名靠前的网站提倡的电子邮件验证正则表达式相关emailregex.com https://emailregex.com/。该网站声称该正则表达式是 RFC 5322 官方标准。但是,正则表达式中的控制字符被 SonarQube 标记为删除,因为它们是不可打印的字符。这是正则表达式:

(?:[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])+)\])

以下是 SonarQube 抱怨的控制字符的完整列表:‘.\x0e…\x0e…\x0c…\x0c…\x0b…\x0c…\x1f…\x01…\x1f…\x01…\x01…\x09…\x08…\x0b…\x0b…\x0e…\x0b…\x08…\x0c…\x0e…\x09…\x01.’

Regular-Expressions.info 的电子邮件页面 https://www.regular-expressions.info/email.html确实解决了上述正则表达式的变体,如下所示:

您不应该使用此正则表达式的原因是它过于广泛。您的应用程序可能无法处理此正则表达式允许的所有电子邮件地址。域特定的路由地址可以包含不可打印的 ASCII 控制字符,如果您的应用程序需要显示地址,这可能会导致麻烦...

但是,我似乎找不到任何解释的信息why一些站点正在添加这些不可打印的控制字符或“特定于域的路由地址”的含义。我看过一些Stack Overflow 正则表达式问题 https://stackoverflow.com/questions/tagged/regex?sort=frequent堆栈溢出正则表达式维基 https://stackoverflow.com/tags/regex/info。控制字符似乎没有被解决。

问题

有人可以解释一下正则表达式中这些控制字符的用途吗?possibly提供一些这个正则表达式何时有用的例子?

(注意:请避免关于验证电子邮件的最佳/最差正则表达式是什么的辩论/讨论。在这个问题上似乎没有达成一致,这个问题已经在 Stack Overflow 和更广泛的互联网上的许多地方进行了讨论和辩论。本题重点在于理解正则表达式中控制字符的用途)。

Update

我还联系了 SonarQube 社区,并且似乎没有人有任何答案 https://community.sonarsource.com/t/why-is-a-email-validation-regular-expression-flagged-for-having-control-characters/71081.

Update

仍在寻找权威答案,以解释为什么上面的电子邮件正则表达式专门检查电子邮件地址中的不可打印控制字符。

里面有这个RFC5322 第 5 节 https://www.rfc-editor.org/rfc/rfc5322#section-5,但它是关于消息正文,而不是地址:

  1. 安全考虑

在终端或终端上显示消息时需要小心 终端模拟器。强大的终端可以作用于转义序列 以及 US-ASCII 控制字符与各种的其他组合 的后果。他们可以重新映射键盘或允许其他 对终端的修改可能导致拒绝服务或 甚至损坏数据。它们可以触发(有时是可编程的)


目的

有人可以解释一下吗purpose正则表达式中这些控制字符的数量[...]?

这些不可打印控制字符的目的是创建一个严格符合定义电子邮件地址格式的 RFC 的正则表达式。

以防万一有人想知道 - 是的 - 这个电子邮件正则表达式中的控制字符确实do符合 RFC 规范。我认为验证这一点超出了这个问题的范围,所以我不会详细引用规范,但这里是相关部分的链接:3.2.3(原子) https://www.rfc-editor.org/rfc/rfc5322#section-3.2.3, 3.2.4(带引号的字符串) https://www.rfc-editor.org/rfc/rfc5322#section-3.2.4, 3.4(地址规范) https://www.rfc-editor.org/rfc/rfc5322#section-3.4, 3.4.1(addr-spec规范) https://www.rfc-editor.org/rfc/rfc5322#section-3.4.1, 4.1(其他过时代币) https://www.rfc-editor.org/rfc/rfc5322#section-4.1。总之,地址的本地部分和域部分允许包含带引号的字符串,允许包含某些不可打印的控制字符。

引用自SonarQube 规则 S6324 https://rules.sonarsource.com/javascript/RSPEC-6324(强调):

ASCII 表中代码 32 以下的条目称为控制字符或非打印字符。因为他们不是common在 JavaScript 字符串中,在正则表达式中使用这些不可见字符是最常见的likely一个失误。

遵循规范是not一个失误。当 lint 规则是usually有用的会遇到人们代码中没有帮助的情况,人们通常只使用 lint 工具的个案忽略机制。我认为这解决了赏金的第二条,其中规定:

有什么更好的替代方案可以避免损坏您的侧面并同时通过 SonarQube 质量门?

IE。使用提供的机制之一使 SonarQube 忽略这些违反规则的行为。您也可以选择完全不检查该规则,但这可能有点矫枉过正。

对于 SonarQube,使用NOSONAR评论 https://docs.sonarqube.org/latest/faq/根据具体情况禁用警告。

有用的例子

这取决于具体情况。

如果您的最终目标纯粹是验证是否任何给定的电子邮件地址是 RFC 定义的有效电子邮件地址,那么严格遵循 RFC 规范的正则表达式非常有用。

这不是每个人的最终目标。引用自维基百科 https://en.wikipedia.org/wiki/Email_address#Local-part:

尽管技术上有效的特殊字符范围很广,但实际上组织、邮件服务、邮件服务器和邮件客户端通常并不接受所有这些字符。例如,Windows Live Hotmail 仅允许使用字母数字、点 (.)、下划线 (_) 和连字符 (-) 创建电子邮件地址。常见的建议是避免使用一些特殊字符,以避免电子邮件被拒绝的风险。

没有什么可以解释的why大多数应用程序并不完全遵守规范,但您可以推测,或者您可以尝试询问他们的维护人员。例如,在某些人的背景下,诸如简单性之类的考虑因素可能会被声明或视为比完全遵守 RFC 更重要。

如果您的目标是检查给定的电子邮件地址是否有效hotmail电子邮件地址and拒绝 RFC 允许但 hotmail 使用的子集不允许的电子邮件地址,则完全符合 RFCnot是必要的(有用的)。

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

此电子邮件验证正则表达式中不可打印控制字符的用途是什么? 的相关文章

随机推荐

  • mysqli:mysqli_result 无法转换为字符串[重复]

    这个问题在这里已经有答案了 我知道已经有人问过很多类似的问题 但我无法将其转化为我的问题 所以这就是我再次询问的原因 代码过去运行良好 但由于 mysql 即将被弃用 我想将其转换为 mysqli 当尝试从数据库读取某些内容时 我收到以下错
  • 具有多列的雄辩 WHERE LIKE 子句

    我正在实现一个搜索栏 可以按名字 姓氏或两者搜索客户 所以 举例来说 Mike Hizer将匹配Mike Hizer zer Mike Hizer等等 这是我想出的 Customer where DB raw concat first na
  • 为 Windows 制作热键最简单的方法是什么?

    For example you push Ctrl V and insert the buffer content into the window How can I create my own hotkeys like that Sorr
  • 在 C#/.NET 中将参数标记为不可为空?

    是否有一个简单的属性或数据契约可以分配给函数参数来阻止null从 C NET 中传递 理想情况下 这也会在编译时进行检查以确保文字null没有在任何地方使用它并且在运行时抛出ArgumentNullException 目前我写的东西像 if
  • Cocos2d for android 支持不同分辨率

    我正在尝试构建一款游戏 并且想知道如何支持不同的分辨率和屏幕尺寸 对于精灵的位置 我实现了一个基本函数 它根据一定的比例设置位置 这是通过从sharedDirector的winSize方法获取屏幕宽度和高度获得的 但这种方法没有经过测试 因
  • 使用 std::fill 用递增的数字填充向量

    我想填写一个vector
  • git status --ignored 无限期挂起

    tl dr 跑步git status ignored在我的项目的根永远不会完成 git status工作正常 我开始从我的 IDE PhpStorm 中看到此问题的症状 尽管此问题适用于所有 IntelliJ IDE 没有与 git 相关的
  • 如何在 TreeTable 的第二列中显示树线

    我正在使用 TreeTable com jidesoft grid 请参阅树表 http www jidesoft com javadoc com jidesoft grid TreeTable html 来显示分层数据 它在第一列上使用特
  • typedef 和模板参数同名

    为什么这种情况不正确 这是合乎逻辑的 template
  • Python物理库? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 Linux 的 Python 的最新物理库 我刚刚开始使用 PyGame 来学习 Pyt
  • 您如何处理 C# 的新功能,以免它们导致编写出糟糕的代码?

    C 3 0 中引入了许多让我感到不安的功能 例如对象初始值设定项 扩展方法和隐式类型变量 现在 在 C 4 0 中 像动态关键字这样的东西我变得更加担心 我知道这些功能中的每一个CAN以适当的方式使用BUT在我看来 它们使开发人员更容易做出
  • 如何从我的应用程序将信用卡添加到 Google Pay?

    我正在开发移动银行应用程序 显然它管理我们的银行信用卡 所以现在我需要在我的应用程序中实现 将此卡添加到 Google Pay 按钮 但如何为此执行 Google Pay API 请求 我无法找到任何相关文档 这这里只有一个关于 SO 的问
  • 如何知道用户是否已付费订阅

    我正在看这个tutorial https www patchesoft com paypal api subscription php创建我自己的贝宝订阅网关 我以前从未对 API 如此困惑和迷失过 因此 当我们创建计划时 我们会设置商家偏
  • 相同的元组给出不同的泡菜

    这种情况很奇怪 我希望有一些关于 pickle 模块的东西我不知道 我有两个元组s1 and s2 如果我比较它们它会返回True s1 s2 True 如果我腌制它们并比较结果 它会返回False pickle dumps s1 pick
  • Kendo UI 工具提示显示,访问目标?

    可以通过传递参数来访问目标e到匿名函数获取内容 gridToolTipz grid kendoTooltip filter td role gridcell content function e var target e target th
  • SOAP 和 REST 如何与 XML/JSON 响应配合使用?

    这是一个在堆栈溢出时一次又一次被问到的非常常见的问题 我读了很多关于这个问题的答案 但我仍然有点困惑 我需要从 iPhone sdk 调用网络服务 这是我的问题 我不清楚 SOAP 或 REST 返回什么响应 是否有什么具体说明 如果响应是
  • 是否有布尔值的后赋值运算符?

    你好 Java 中可能有这样的事情吗 boolean flag true if flag return flag false return true and assign false to flag afterwards 澄清 上面的方法有
  • 在 redshift postgresql 中我可以使用复制功能跳过列吗

    我有一个 csv 表 t1 其中包含以下列 亚马逊 S3 存储中的 c1 c2 c3 我想将其复制到亚马逊红移中 我创建包含以下列的表 c1 c2 c3 其中所有列均可为空 我用命令复制 复制 t1a c1 c3 从 t1 我预计它会从 t
  • 本地网络上的 WebRTC? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在阅读有关 WebRTC 的内容 它看起来非常有前途 我想制作一个简单的局域网游戏 自动连接同一网络上的人们 尽管我可以找到人们
  • 此电子邮件验证正则表达式中不可打印控制字符的用途是什么?

    背景资料 我们使用 SonarQube 来获取有关代码库的质量指标 根据规则 SonarQube 在我们的 Node js 代码库中标记了十多个错误S6324 https rules sonarsource com javascript R