2016-06-07 3 views
4

Обработка регулярного выражения с помощью java.util.regex приводит к переполнению стека для больших строк и сложного регулярного выражения (особенно с |).Java regex parser без переполнения стека

Есть ли способ обработки регулярных выражений более оборонительны в Java, как

  • имеющие нерекурсивный режим для регулярного выражения
  • бросающего catchable исключения для тех регулярных выражений (вместо java.lang .Stackoverflow error),

или любой другой механизм, который не убивает мою программу или не переносит ее в состояние, не подлежащее восстановлению?

+3

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

+1

Правда, это часто бывает разумно. Но на самом деле раздражает появление регулярного выражения, пусть оно проходит все модульные тесты, помещает их в большую программу анализа, чтобы увидеть, как он сбой в 2 утра, потому что некоторая входная строка была действительно большой. –

+0

Этот ответ был дан ответ несколько раз. Реализовать некоторый механизм тайм-аута: http://stackoverflow.com/questions/910740/cancelling-a-long-running-regex-match –

ответ

0

StackOverflowError можно поймать и обработать точно так же, как любое исключение. Ошибки сигнализируют о серьезных проблемах, которые вы обычно не должны ловить, но в этом случае вы знаете, что это такое, и вам нужно справиться с этим. Просто поймайте его и обработайте ситуацию (или перебросьте специальное исключение).

Возможно, вы также захотите использовать флаг командной строки -Xss, чтобы увеличить размер стека.

+0

Согласен со второй частью. Первая часть кажется немного отрывочной. Обработка ошибки времени выполнения работает вокруг актуальной проблемы. Мне кажется, что пользователь должен корректно вводить и пересматривать выражения на основе требования, если это вызывает ошибки времени выполнения. –

+0

Да, @ringbearer, я согласен с вами, лучше всего это _avoid_ проблема, по крайней мере, если это можно сделать по разумной цене. В этом случае я хочу предложить способ предотвращения ущерба, который может быть отправной точкой, ожидая лучшего решения (которое может или не придет) ... –

+0

Единственное правильное решение: * использовать только регулярные выражения, которые письменный. для линейного развертывания принципа цикла, где каждый предшествующий подшаблон не может совпадать с тем же символом, что и последующий подшаблон. * –

Смежные вопросы