我想使用通用前缀(/ files)匹配URL,但在其下仅匹配两个特定目录(图像和视频)。我可以想到两个正则表达式:
/files/(images/.*|videos/.*)

/files/(image|video)s/.*
我在这里有两个问题:

  • 从性能角度来看哪个更好?我的猜测是第二个,因为其DFA的州将更少。
  • 是否有一种通用的编程语言,其内置的正则表达式编译器会将给定的正则表达式简化为最小DFA?

  • 性能对我很重要,因为我将使用它来匹配数十亿个字符串。因此,任何微小的改进对我也很重要。

    最佳答案

    Python 2.7说:

    import timeit
    once = 'import re; m="/files/images/test"'
    num = 1000000
    print timeit.timeit(stmt='re.findall(r"/files/(images/.*|videos/.*)", m)', setup=once, number=num)
    -> 1.5884420871734619
    print timeit.timeit(stmt='re.findall(r"/files/(image|video)s/.*", m)', setup=once, number=num)
    -> 1.5990869998931885
    

    这使用了100万次正则表达式,并且在两次运行两次之后,两者的速度相同。

    Python可能会缓存已编译的正则表达式...

    我用
  • /文件/图像/测试
  • /文件/视频/测试
  • /文件/ viddeos /测试

  • 您的第一个版本(/files/(images/.*|videos/.*))在我的测试中运行速度加快了(0.1秒)

    09-25 20:10
    查看更多