2015-03-11 5 views
1

Мне нужно регулярное выражение, которое имеет успех 0-300 слов и не может содержать 301 или более слов.регулярное выражение для ограничения 300 слов

Я пробовал:

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

Я также проверил

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

Оба работают нормально, но в Java я получаю java.lang.StackOverflowError. Я знаю, используя более крупный «XSS», я обошел эту проблему, но я хотел спросить, есть ли способ оптимизировать регулярное выражение?

+5

* «Оба работают нормально, но на Java я получаю« java.lang.StackOverflowError »« * Ум, как они могут «отлично работать» ** и ** бросать исключение? –

+0

Извините, что вы правы ... Оба отлично выполняют эту работу, если я тестирую онлайн-инструмент regex, например https://regex101.com/, но на Java они не работают – user1635689

+0

Затем вам нужно будет показать свои используя его, поскольку это может быть проблемой. –

ответ

2

Я считаю, что проблема в том, что реализация Java в шаблон израсходовал стек для каждого повторения группы из-за обратного слежения. Решение может быть либо изменить свой подход, как другие ответили или сделать все кванторы притяжательные:

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

или

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

Для получения дополнительной информации см here или here.

+0

Удивительное спасибо, что сделал мой день :-) – user1635689

1

Вы можете использовать String.split и проверить размер возвращаемого массива.

+0

Я не могу, я использую рамки ограничений. И было бы действительно сложно написать собственный код (возможно, в крайнем случае). Любая идея, если регулярное выражение можно улучшить? – user1635689

+0

'String.split' является частью стандартной Java - что вы имеете в виду? –

+0

Я использую ограничение hibernate, я не могу добавить пользовательский код Java. Только изменения в регулярном выражении ... – user1635689

0

Ваше регулярное выражение будет неуспешным, если 300th слово является последним словом и нет space впереди владение.У должны использовать

^ *(?:\S+(?: +|$)){0,300} *$ 
Смежные вопросы