В прошлый раз, когда я занимал вашу должность, я использовал продукт под названием jflex .
Регулярное выражение Java не предоставляет традиционных гарантий производительности O (N log M) для настоящих механизмов регулярных выражений(для входных строк длины N и шаблонов длины M).Вместо этого он наследует от своих perl корней экспоненциальное время для некоторых шаблонов.К сожалению, эти патологические паттерны, хотя и редки при нормальном использовании, слишком часто встречаются при объединении регулярных выражений, как вы предлагаете (я могу засвидетельствовать это из личного опыта).
Следовательно, мой совет:
a) предварительно скомпилируйте ваши шаблоны как константы "static final Pattern", чтобы они были инициализированы один раз во время [cinit];или
b) переключиться на пакет лексеров, такой как jflex , который обеспечит более декларативный и гораздо более читаемый синтаксис для подхода к такого рода каскадной / последовательной обработке регулярных выражений;и
c) серьезно рассмотреть возможность использования пакета генератора синтаксического анализатора.Мой текущий фаворит Бобр , но CUP также является хорошим вариантом.Оба из них являются отличными инструментами, и я настоятельно рекомендую оба из них, и, поскольку они оба находятся на вершине jflex, вы можете добавлять их по мере необходимости.
Это, как говорится, если вы не использовалипарсер-генератор до и вы спешите, вам будет легче набрать скорость с JavaCC .Не такой мощный, как Beaver / CUP, но его модель разбора легче понять.
Что бы вы ни делали, пожалуйста, не используйте Antlr.Это очень модно, и у него есть отличные чирлидеры, но его онлайн-документация отстой, его синтаксис неудобен, его производительность плохая, а дизайн без сканера делает несколько простых простых случаев болезненными для обработки.Вам было бы лучше использовать мерзость, такую как sablecc (v1).
Примечание: Да, я использовал все, что упомянул выше, и даже больше;так что этот совет исходит из личного опыта.