регулярное выражение для ограничения 300 слов

1

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

Я пытался:

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

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

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

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

  • 5
    «Оба работают нормально, но в Java я получаю« java.lang.StackOverflowError »« Гм, как они могут «работать нормально» и вызывать исключение?
  • 0
    Извините, что вы правы ... Оба отлично справляются со своей задачей, если я тестирую его в онлайн-инструменте regex, например regex101.com, но в Java они не работают
Показать ещё 1 комментарий
Теги:
exception
stack-overflow

3 ответа

2
Лучший ответ

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

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

или

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

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

  • 0
    Потрясающее спасибо, что сделали мой день :-)
1

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

  • 0
    Я не могу, я использую рамки ограничений. И было бы действительно сложно написать собственный код (возможно, в крайнем случае). Любая идея, если регулярное выражение может быть улучшено?
  • 0
    String.split является частью стандартной Java - что вы имеете в виду?
Показать ещё 2 комментария
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню