Я работаю со сторонним приложением, которое использует библиотеку restlet.org для сопоставления URL-адресов без остановки и компонентов Spring. Оно генерирует следующий шаблон для сопоставления очень простого URL-адреса:

Шаблон URL - / api / 0 / full / {action} / {paramsJSON}

Сгенерированный шаблон регулярного выражения

/api/0/preauthfull/((?:[a-zA-Z\d\-\.\_\~\!\$\&\'\(\)\*\+\,\;\=\:\@]|(?:\%[\dABCDEFabcdef][\dABCDEFabcdef]))+)/((?:[a-zA-Z\d\-\.\_\~\!\$\&\'\(\)\*\+\,\;\=\:\@]|(?:\%[\dABCDEFabcdef][\dABCDEFabcdef]))+)

Он не работает, как только шаблон превышает 220 символов. Интересно, что это не работает только в среде сервера tomcat, а не на пристани, хотя они оба работают с одним и тем же jre. Я немного не понимаю, как это исправить, регулярное выражение создается динамически с помощью restlet-

0
chrismarx 10 Дек 2012 в 04:13
Просто чтобы уточнить: терпит ли он неудачу при длинном вводе или он терпит неудачу при длинном шаблоне?
 – 
nhahtdh
10 Дек 2012 в 05:28

1 ответ

Лучший ответ

Возможно, у вас возникла проблема с размером стека по умолчанию для потоков. Это известная проблема с java.util.regex.Pattern, она касается слишком глубоких рекурсий, никогда не пробовала, честно говоря, чтобы глубже изучить, что происходит внутри этой штуки, просто попробуйте увеличить размер стека JVM, например

java -Xss1024k

Пока узор не будет счастлив

1
Evgeniy Dorofeev 10 Дек 2012 в 17:59