我需要一个正则表达式,成功0-300个单词,并且301或更多单词失败。
我试过了:
^\s*(\S+\s+){0,300}\S*$
我也检查了
^\W*(?:\w+\b\W*){0,300}$
两者都运行正常但在Java中我得到了一个 java.lang.StackOverflowError 。我知道使用更大的“XSS”我解决了这个问题,但我想问一下是否有办法优化正则表达式?
答案 0 :(得分:2)
我认为问题在于,由于回溯,Pattern的Java实现会为每次重复组使用一个堆栈。解决方案可能是改变你的方法,就像其他人已经回答的那样,或者让所有量词都占有欲:
^\s*(\S+\s+){0,300}+\S*$
或
^\W*(?:\w+\b\W*){0,300}+$
答案 1 :(得分:1)
您可以使用String.split
并检查返回数组的大小。
答案 2 :(得分:0)
如果300th
字是最后一个字并且前面没有space
,那么正则表达式将会失败。您应该使用
^ *(?:\S+(?: +|$)){0,300} *$