Мне нужно регулярное выражение, которое имеет успех 0-300 слов и не может содержать 301 или более слов.
Я пытался:
^\s*(\S+\s+){0,300}\S*$
Я также проверил
^\W*(?:\w+\b\W*){0,300}$
Оба работают нормально, но в Java я получаю java.lang.StackOverflowError. Я знаю, используя более крупный "XSS", я обошел эту проблему, но я хотел спросить, есть ли способ оптимизировать регулярное выражение?
Я считаю, проблема заключается в том, что реализация Java-шаблона использует стек для каждого повторения группы из-за обратного отслеживания. Решением может быть либо изменить ваш подход, как другие ответили, либо сделать все кванторы собственными:
^\s*(\S+\s+){0,300}+\S*$
или
^\W*(?:\w+\b\W*){0,300}+$
Для получения дополнительной информации см. Здесь или здесь.
Вы можете использовать String.split
и проверить размер возвращаемого массива.
String.split
является частью стандартной Java - что вы имеете в виду?
Ваше регулярное выражение будет неуспешным, если 300th
слово является последним словом и не существует space
впереди владениий следует использовать
^ *(?:\S+(?: +|$)){0,300} *$