表现不佳的正则表达式

时间:2010-04-22 14:12:47

标签: javascript regex performance

我的表现非常糟糕,目前正在使Firefox,Chrome和IE挂起一段时间。

这是注册表:

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

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

有效示例:

  • 段/段
  • 细分/细分/细分(等)

无效的例子:

  • /段
  • 段/
  • 段/分段/

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

这显然是一个形成不良的注册表,但任何人都可以帮助建立一个更好的注册表吗?

谢谢,

3 个答案:

答案 0 :(得分:7)

更好的一个会更具确定性,而且不会捕捉群体:

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

通过这种方式,您没有重叠的群组,并且您没有不必要地捕获内容。

答案 1 :(得分:3)

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

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

即。 0或更多(1 + alphamerics-then-slash)然后最后帮助(1+ alphamerics)。 (当然,正如其他答案所提到的那样,如果您希望该组无法捕获,可以在开放式paren之后放置?:

答案 2 :(得分:2)

尝试

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

或者如果确实需要[a-zA-Z0-9]+,请尝试

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

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