我有一个正则表达式,应该验证字符串是否由空格分隔的字符串组成。正则表达式工作得很好(好吧,它最后允许有一个空格......但这不是他的问题),但是当验证失败时需要很长时间。
正则表达式如下:
/^(([\w\-]+)( )?){0,}$/
当尝试使用字符串进行验证时
"'this-is_SAMPLE-scope-123,this-is_SAMPLE-scope-456'"
需要2秒。
测试在 ruby 1.9.2-rc1 和 1.8.7 中进行。但这可能是一个普遍问题。
任何想法?
你的模式导致灾难性的回溯 http://www.regular-expressions.info/catastrophic.html。灾难性的部分可以总结为:
(.+)*
The +
和*
在某些引擎中以灾难性的方式相互作用。
目前还不清楚你到底想匹配什么,但可能是这样的:
^[\w\-]+( [\w\-]+)*$
这匹配 (如 rubular.com 上所示 http://www.rubular.com/r/BTRKHBzTuS):
hello world
99 bottles of beer on the wall
this_works_too
并拒绝:
not like this, not like this
hey what the &#@!
too many spaces
另一种选择是在原始模式的某些部分使用所有格量词和/或原子分组。
参考
-
正则表达式.info/所有格量词 http://www.regular-expressions.info/possessive.html and 原子分组 http://www.regular-expressions.info/atomic.html
附加提示
The {0,}
重复通常简单地写为*
。您还可以使用非捕获组来提高性能,即(?:pattern)
.
参考
-
用于捕获的正则表达式.info/括号 http://www.regular-expressions.info/brackets.html and 用星号和加号重复 http://www.regular-expressions.info/repeat.html
相关问题
- 使用明确编号的重复而不是问号、星号和加号 https://stackoverflow.com/questions/3032593/using-explicitly-numbered-repetition-instead-of-question-mark-star-and-plus
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)