正则表达式限制300个单词

时间:2015-03-11 08:10:43

标签: java regex exception stack-overflow

我需要一个正则表达式,成功0-300个单词,并且301或更多单词失败。

我试过了:

^\s*(\S+\s+){0,300}\S*$

我也检查了

^\W*(?:\w+\b\W*){0,300}$

两者都运行正常但在Java中我得到了一个 java.lang.StackOverflowError 。我知道使用更大的“XSS”我解决了这个问题,但我想问一下是否有办法优化正则表达式?

3 个答案:

答案 0 :(得分:2)

我认为问题在于,由于回溯,Pattern的Java实现会为每次重复组使用一个堆栈。解决方案可能是改变你的方法,就像其他人已经回答的那样,或者让所有量词都占有欲:

^\s*(\S+\s+){0,300}+\S*$

^\W*(?:\w+\b\W*){0,300}+$

有关详细信息,请参阅herehere

答案 1 :(得分:1)

您可以使用String.split并检查返回数组的大小。

答案 2 :(得分:0)

如果300th字是最后一个字并且前面没有space,那么正则表达式将会失败。您应该使用

^ *(?:\S+(?: +|$)){0,300} *$