【问题标题】:Poorly performing regex表现不佳的正则表达式
【发布时间】:2010-04-22 14:12:47
【问题描述】:

我有一个非常糟糕的正则表达式,目前它会使 Firefox、Chrome 和 IE 挂起一段时间。

这是正则表达式:

 ^([a-zA-Z0-9]+[/]?)+[a-zA-Z0-9]+$

这是一种 url 匹配器,但应该只匹配请求的路径(不以斜杠开头或结尾)。

有效例子:

  • 段/段
  • 段/段/段(等)

无效示例:

  • /段
  • 段/
  • 段/段/

在所有三个浏览器上使用上述正则表达式并使用两个或多个斜杠会导致浏览器挂起。

这显然是一个格式不正确的正则表达式,但任何人都可以帮助构建一个更好的正则表达式吗?

谢谢,

【问题讨论】:

    标签: javascript regex performance


    【解决方案1】:

    一个更好的将更具确定性,并且没有捕获组:

    ^[a-zA-Z0-9]+(?:/[a-zA-Z0-9]+)*$
    

    这样您就没有重叠的组,也不会不必要地捕获事物。

    【讨论】:

      【解决方案2】:

      我认为问题在于,使用可选的/ 字符串可以以太多方式解析,特别是任何 N 字母组合序列都可以以 N-1 方式匹配。怎么样:

      ^([a-zA-Z0-9]+[/])*[a-zA-Z0-9]+$
      

      即0 个或更多(1+ alphamerics-then-slash),然后是(1+ alphamerics)的最后一个帮助。 (当然,正如其他答案所提到的,如果您希望该组不被捕获,您也可以在开放括号之后放置一个?:)。

      【讨论】:

        【解决方案3】:

        试试

        ^(?:[^/]+/)*[^/]+$
        

        或者如果[a-zA-Z0-9]+真的有必要,试试

        ^(?:[a-zA-Z0-9]+/)*[a-zA-Z0-9]+$
        

        我个人认为,第一个应该更快

        【讨论】:

        • 这行得通,除了允许非字母数字字符。不过还是谢谢。
        • 是的@Kieron,这允许除/之外的任何内容,但我认为[^/]+ 应该比[a-zA-Z0-9]+ 快,并且还添加了带有[a-zA-Z0-9]+ 的版本。
        猜你喜欢
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        • 2015-12-29
        相关资源
        最近更新 更多