我正在尝试使用这个正则表达式,但是我在测试它时遇到了麻烦,因为无论出于什么原因它只会崩溃我使用的两个正则表达式测试器。
^([A-ZA-Z - ] + /)+ $
如果我没弄错的话,那应该匹配遵循这种格式的任何URI:
一些-URI字符串/一些-URI字符串/一些-URI字符串
但是,我不希望它匹配:
一些-URI字符串/一些-URI字符串//一些-URI字符串
注意双斜杠。基本上,它是类别/子类别/子子类别/页面
允许任意数量的子类别。
答案 0 :(得分:3)
问题在于,对于不匹配的字符串,您的模式是回溯正则表达式引擎的病态案例(在大多数脚本语言中都是如此,例如Perl,Python和基于PCRE的任何东西)。
更多信息:
您可以将其重写为:
^([a-zA-Z-]+/)*[a-zA-Z-]+$
或者你的RE实施可能有其他设施可以避免这种情况。
答案 1 :(得分:2)
查找灾难性的回溯...你需要更好地定义它,或者写一个一次一个部分地删除URI字符串......这个是递归的,为什么它会崩溃你...或者,你可以把它从贪婪改为懒惰......我实际上并没有调查这个正则表达式,但这就是我所看到的......
答案 2 :(得分:0)
对于PCRE,您可以使组成为原子以避免灾难性的回溯。只需像这样添加?>
:
^(?>[a-zA-Z-]+/?)+$
请参阅“Atomic Grouping and Possessive Quantifiers”下的PCRE manual。
答案 3 :(得分:0)