То, что вы пытаетесь сделать, это восстановить промежуточные записи из групп, которые совпадают более одного раза за совпадение с регулярным выражением. Насколько я знаю, только .NET и Perl 6 предоставляют такую возможность. Вам придется выполнить работу в два этапа: сопоставить значение атрибута с одной или несколькими %tag%
последовательностями в нем, а затем выделить отдельные последовательности.
Вам не важно, с каким XML-тегом или атрибутом связаны значения, поэтому вы можете использовать это, несколько более простое регулярное выражение, чтобы найти значения с %tag%
последовательностями в них:
'#"([^"%<>]*+%[^%"]++%[^"]*+)"|\'([^\'%<>]*+%[^%\']++%[^\']*+)\'#'
EDIT: это регулярное выражение захватывает значение атрибута в группе 1 или группе 2, в зависимости от того, в каких кавычках оно использовалось. Вот еще одна версия, которая объединяет альтернативы, поэтому всегда может сохранить значение в группе 2:
'#(["\'])((?:(?![%<>]|\1).)*+%(?:(?!%|\1).)++%(?:(?!\1).)*+)\1#'