ок, если интересно - ход рассуждений примерно таков:
RegExpReplace работает блоками, т.е. мы должны задействовать в замене ВСЮ строку без пропусков, тут вариантов всего два:
1) захват и обработка за ход всего блока "
[+-][^+-]+", либо
2) работа посимвольно "
[^+-]".
1-й подход - это "лобовой" перебор вариантов, причем с обязательной посимвольной детализацией содержимого блока (иначе как потом раскрывать в замене?), т.е придётся описать 7 комбинаций ~28 символьных позиций + метасимволы групп, сохранений и т.д. - перспектива удручающая...
2-й подход интересней, но тут одна проблема - как при обработке очередного символа восстановить результат из обработки прошлых символов?... поискать можно в двух направлениях:
А) возможность "глобальных" (меж-атомарных) сохранений ($1 действительна только в пределах блока); или
Б) попытаться использовать при обработке символы строки вне обрабатываемого блока.
Способ А есть в Perl и соответствует его обычным переменным, т.к. регулярные выражения - его смысловое ядро ("native inborn"), в библиотеке PCRE вроде есть именованные переменные, но описаны слабо и по ходу всё зависит от конечной сборки библиотеки... Короче, эксперименты ни к чему не привели - именованные переменные в AutoIT не работают (пока?).
Способ Б и есть та самая позиционная проверка (опережающая и ретроспективная), так хорошо описанная в книге
Дж.Фридла – очень мощный приём, некоторые задачи без неё просто нерешаемы. Как уже сказал выше – в ранних реализациях RegExp они не поддерживались, тут представился повод еще раз проверить.
Цитата Creat0R:
Нужно разработчикам написать, чтобы добавили.»
|
да, теперь уже нужно