代码之家  ›  专栏  ›  技术社区  ›  Kieron

性能不佳的regex

  •  2
  • Kieron  · 技术社区  · 15 年前

    我有一个非常糟糕的regex,目前它使firefox,chrome和ie挂一段时间。

    这是注册前:

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

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

    有效实例:

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

    无效示例:

    • /段
    • 片段/
    • 段/段/

    在所有三个浏览器上使用上面的regex,并使用两个或多个斜杠会导致浏览器挂起。

    这显然是一个不良的注册前,但谁能帮助建立一个更好的?

    谢谢,

    3 回复  |  直到 15 年前
        1
  •  7
  •   Welbog    15 年前

    一个更好的方法是更具确定性,并且不捕获组:

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

    这样你就不会有重叠的群体,也不会不必要地捕捉事物。

        2
  •  3
  •   Alex Martelli    15 年前

    我认为问题在于,有了选修课 / 字符串可以用太多的方式解析,特别是N个字母的任何序列都可以用N-1方式匹配。如何:

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

    即0或更多(1+字母,然后斜线),然后是(1+字母)的最后一个帮助。(当然,正如其他答案所提到的,你可以 放一个 ?: 如果您希望组不被捕获,则在打开paren之后。

        3
  •  2
  •   YOU    15 年前

    尝试

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

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

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

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