我最近收到了一些求职者的测试结果,其中有人声称他们提供的解决方案更有效(我不想说,因为我不想影响答案)。不用说,我很怀疑,但是我对RE编译器的内部工作了解得不够多,无法明智地进行评论。

问题是:给出正则表达式以识别从0到99(含0)之间的数字。

答案是:

[0-9]{1,2}
[0-9]?[0-9]
[0-9]|([0-9][0-9])

我对为什么其中任何一个速度更快(或以其他任何方式更好)感兴趣。提供证据而不是con测的加分点,但是如果您说得足够令人信服,我仍然会con测:-)

最佳答案

表达式[0-9]{1,2}应该是我想象中最快的,尽管它取决于特定的引擎。

我的理由是:

  • [0-9] {1,2}-准确地描述了您要匹配的内容。
  • [0-9]?[0-9]-如果第一个比赛失败,这可能会导致回溯。
  • [0-9] |([0-9] [0-9])-如果第一个字符失败,则需要对其进行两次检查,此处的括号是不必要的,并且会导致不必要的捕获。

  • 这是在.NET(不使用RegexOptions.Compiled)中进行测试时每秒获得的迭代次数:

    正则表达式100%有效输入50%有效输入100%无效输入
    “^ [0-9] {1,2} $” 749086 800313 870748
    “^ [0-9]?[0-9] $” 731951 725984 740152
    “^(?:[0-9] |([0-9] [0-9]))$” 564654 687248 870378

    使用RegexOptions.Compiled:

    正则表达式100%有效输入50%有效输入100%无效输入
    “^ [0-9] {1,2} $” 1486212 1592535 1831843
    “^ [0-9]?[0-9] $” 1301557 1448812 1559193
    “^(?:[0-9] |([0-9] [0-9]))$” 1131179 1303213 1394146

    并作为一个图形:

    注意:我修改了每个正则表达式以要求完全匹配,而不是执行搜索。

    关于regex - 哪个是更有效的正则表达式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4272567/

    10-12 00:23
    查看更多