Вы используете неправильный инструмент для работы ... Это требует некоторого сохранения состояния, и, вообще говоря, регулярные выражения не сохраняют состояния.
Пример реализации bdecoding (и bencoding) в PERL, который я сделал, можно найти здесь .
Объяснение того, как работает эта функция (поскольку я так и не смог ее прокомментировать [упс]):
По сути, вам нужно настроить рекурсивную функцию. Эта функция принимает строковую ссылку (поэтому ее можно изменить) и возвращает «что-то» (природа этого означает, что это может быть массив, хеш-таблица, целое число или строка).
Сама функция просто проверяет первый символ в строке и решает, что делать на основании этого:
- Если это
i
, то проанализируйте весь текст между i и первым e и попытайтесь проанализировать его как int в соответствии с правилами что разрешено.
- Если это цифра, то читать все цифры до : , а затем читать столько символов из строки.
Списки и словари - вот где все становится интересным ... если в качестве первого символа указан l или d , то вам необходимо удалить l
/ d
, затем передайте текущую строку обратно в функцию, чтобы она могла начать анализ элементов в списке или словаре. Затем просто сохраните возвращенные значения в соответствующих местах в соответствующей структуре, пока не достигнете e
, и вернитесь к структуре, с которой вы остались.
Помните, что функция, которую я реализовал, была ДЕСТРУКТИВНОЙ. Переданная строка пуста, когда функция возвращается из-за того, что она была передана по ссылке, или, точнее, она будет лишена всего, что она проанализировала и вернула (поэтому она может использоваться рекурсивно: все, что она не обрабатывает, остается нетронутый). В большинстве случаев при первоначальном вызове это должно обрабатывать все, если вы не делаете что-то странное, так что вышеприведенное верно.