失败时正则表达式很慢

时间:2010-07-09 11:48:09

标签: ruby regex optimization

我有一个正则表达式,应该验证字符串是否由空格分隔的字符串组成。正则表达式运行良好(好吧它最终允许空白空间......但这不是问题)但验证失败时需要太长时间。

正则表达式如下:

/^(([\w\-]+)( )?){0,}$/

尝试使用字符串

进行验证时
"'this-is_SAMPLE-scope-123,this-is_SAMPLE-scope-456'"

需要2秒钟。

测试在ruby 1.9.2-rc1和1.8.7中进行。但这可能是一个普遍的问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

您的模式会导致catastrophic backtracking。灾难性的部分可归纳为:

(.+)*

+*在某些引擎中以灾难性的方式进行交互。

目前还不清楚你要匹配的是什么,确切地说,但它可能是这样的:

^[\w\-]+( [\w\-]+)*$

匹配(as seen on rubular.com):

hello world
99 bottles of beer on the wall
this_works_too

并拒绝:

not like this, not like this
hey what the &#@!
too many    spaces

另一种选择是在原始模式的某些部分使用占有量词和/或原子分组。

参考


其他提示

{0,}重复通常简称为*。您还可以使用非捕获组来提高性能,即(?:pattern)

参考

相关问题