失败时正则表达式很慢

mig*_*ira 3 ruby regex optimization

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

正则表达式如下:

/^(([\w\-]+)( )?){0,}$/
Run Code Online (Sandbox Code Playgroud)

尝试使用字符串进行验证时

"'this-is_SAMPLE-scope-123,this-is_SAMPLE-scope-456'"
Run Code Online (Sandbox Code Playgroud)

它需要2秒.

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

任何的想法?

pol*_*nts 8

你的模式导致灾难性的回溯.灾难性部分可归纳为:

(.+)*
Run Code Online (Sandbox Code Playgroud)

+*在一些发动机灾难性的方式进行交互.

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

^[\w\-]+( [\w\-]+)*$
Run Code Online (Sandbox Code Playgroud)

匹配(如rubular.com上所示):

hello world
99 bottles of beer on the wall
this_works_too
Run Code Online (Sandbox Code Playgroud)

拒绝:

not like this, not like this
hey what the &#@!
too many    spaces
Run Code Online (Sandbox Code Playgroud)

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

参考


其他提示

{0,}重复通常简单地写成*.您还可以使用非捕获组来提高性能,即(?:pattern).

参考

相关问题