У меня есть несколько тысяч XML-файлов, сгенерированных из файлов свойств Java, подготовленных для перевода в формате TTX. Они содержат довольно много переменных, которые мне нужно защитить от переводчиков, так как они часто ломают такие вещи. Переменные имеют форму чисел или иногда текст между парой фигурных скобок, например. {0}, {это}.
Мне нужно окружить эти переменные элементом xml, если они еще не являются атрибутом и если они еще не являются частью внутреннего текста элемента ut , например:
<ut DisplayText="{0}"><{0}></ut>
Мой вклад выглядит так:
<ut Type="start"DisplayText="string"><string></ut> text string {0}
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> {2}.
<ut Type="end" DisplayText="resource"></resource></ut>
Правильный вывод должен быть таким:
<ut Type="start"DisplayText="string"><string></ut> text string <ut DisplayText="{0}">{0}</ut>
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> <ut DisplayText="{2}">{2}</ut>.
<ut Type="end" DisplayText="resource"></resource></ut>
Мой первоначальный подход состоял в том, чтобы использовать регулярное выражение для сопоставления термина в фигурных скобках и просто построить вокруг него элементы xml с заменой шаблона. Этот подход терпит неудачу, когда шаблон присутствует, как в первом кодовом блоке выше.
Предыдущие шаблоны поиска и замены (в блокноте ++):
Найти
({[A-Za-z0-9]*})
Заменить
<ut DisplayText="\1">\1</ut>
Начинает казаться, что регулярное выражение не является подходящим инструментом для работы, поэтому я хотел бы высказать несколько предложений о лучших подходах, различных инструментах или даже просто более полное регулярное выражение, которое может позволить мне быстро и повторяемость.
Обновление: Проблема оказалась немного более сложной, чем предполагалось ранее. Похоже, что есть еще пара вещей, которые необходимо защитить, включая довольно неясный синтаксис, смешивание переменных с текстом в чем-то вроде условного выражения. По памяти:
{o,choice|1#1 error|1<{0,number,integer} errors}
Где «ошибка» и «ошибки» могут быть переведены и не должны быть защищены. Самое простое решение, которое у нас есть на данный момент, - запустить приведенное выше регулярное выражение, исправить несколько нечетных ошибок, которые он создает, и затем выполнить еще пару обычных операций поиска и замены для более сложных элементов. Его можно абстрагировать как регулярное выражение, но сейчас нет особого смысла в этом.
Я ценю указатели на xslt и другие редакторы с лучшей поддержкой регулярных выражений, в дополнение к предложенным улучшенным выражениям. Я буду играть с некоторыми из опций, когда позволит время.