【问题标题】:Converting an FSA to a regular expression将 FSA 转换为正则表达式
【发布时间】:2019-03-19 08:41:01
【问题描述】:

今天早上,我创建了一个 FSA,旨在验证电子邮件的本地部分。为了自己简化这些事情,我制定了这些规范

'电子邮件地址的本地部分必须使用以下任何一种;大写 A-Z 和小写 a-z 字母、数字 0-9、“+”和点“.”,前提是它们不连续出现。本地部分不得以“+”或点“。”开头或结尾。 '

Local Part

我很高兴这涵盖了我提出的要求,但是,我在将其转换为正则表达式时遇到了麻烦。很明显,它开始于, ^[A-Za-z0-9] 并以@$ 结尾,但在那之后,我不知道如何构造它。

任何指导将不胜感激。

【问题讨论】:

    标签: regex finite-automata


    【解决方案1】:

    嗯,如果我理解正确的话就可以了

    ^[A-Za-z0-9][A-Za-z0-9+.]+@$
    

    https://regex101.com/r/MxMMeq/1

    ^[\w\d]+([+.][\w\d]+)*@$
    

    https://regex101.com/r/MxMMeq/7

    【讨论】:

    • 这允许相邻的加号和点。
    • 什么意思?你检查过沙盒吗?
    • 该评论显然与我发表评论时的版本有关。
    【解决方案2】:

    将其视为三种不同的状态。您需要以一个或多个[A-Za-z0-9] 开头,然后可以选择单个点或加号,然后跳回到开始状态,最后在@ 上接受。

    ^[A-Za-z0-9]+([.+][A-Za-z0-9]+)*@
    

    这实际上不是一个很好的规范;它不允许许多有效的电子邮件地址。你应该参考RFC5222中的实际定义。

    【讨论】:

    • 这样干净多了,谢谢。我的任务最好希望它被简化(从高中开始),但我认为知道我可以进一步简化它,我会尝试更全面的正则表达式。
    • ^[\w\d]+([+.][\w\d]+)*@$
    • @Piterden 仍然无法允许破折号和其他一些不太常见但在技术上完全有效的字符。根据平台的不同,\w 也可能依赖于语言环境,这可能是好是坏,具体取决于您希望实现的目标。
    【解决方案3】:

    带有负前瞻(检查后续.):

    ^[A-Za-z0-9](?!.*\.\..*)[A-Za-z0-9+.]*[A-Za-z0-9]@$
    

    【讨论】:

    • 使用一些测试用例,我注意到您的表达式允许本地部分以 '.' 结尾和“+”。 regex101.com/r/MxMMeq/4 负前瞻是我以前从未见过的,所以谢谢。
    • 如果你不介意再问一个问题,我如何检查这个正则表达式和我的 FSA 是否等价?
    • @Okeh,测试? :) 以单元测试为例,mb 有一些自动化测试框架/工具可以实现这一点。老实说,我对 FSA 一无所知...
    • 好的,不用担心。我会尝试学习如何正确减少,否则我会使用你的。
    猜你喜欢
    • 2011-10-02
    • 2016-04-02
    • 1970-01-01
    • 2019-05-11
    • 2014-11-08
    • 2017-12-29
    • 2023-03-09
    • 2013-06-26
    相关资源
    最近更新 更多