Как заключать текстовые шаблоны в xml-элементы, за исключением случаев, когда они уже находятся внутри определенного xml-элемента?

StackOverflow https://stackoverflow.com/questions/1160164

Вопрос

У меня есть несколько тысяч xml-файлов, сгенерированных из файлов свойств Java, подготовленных для перевода в формат TTX.Они содержат довольно много переменных, которые мне нужно защитить от переводчиков, так как они часто нарушают такие вещи.Переменные представлены в виде чисел или иногда текста между парой фигурных скобок, например.{0}, {это}.

Мне нужно окружить эти переменные xml-элементом, если они еще не являются атрибутом и если они еще не являются частью внутреннего текста ut элемент, вот так:

<ut DisplayText="{0}">&lt;{0}&gt;</ut>

Мой вклад выглядит примерно так:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string {0} 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
<ut DisplayText="\n">&lt;\n/&gt;</ut> {2}.
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>

Правильный вывод должен быть таким:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string <ut DisplayText="{0}">{0}</ut> 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in:
<ut DisplayText="\n">&lt;\n/&gt;</ut> <ut DisplayText="{2}">{2}</ut>.
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut>

Мой первоначальный подход состоял в том, чтобы использовать регулярное выражение для сопоставления с термином в фигурных скобках и просто создавать xml-элементы вокруг него с заменой шаблона.Этот подход терпит неудачу, когда шаблон присутствует, как в первом блоке кода выше.

Предыдущие шаблоны поиска и замены (в notepad ++):

Найти

({[A-Za-z0-9]*})

Заменить

<ut DisplayText="\1">\1</ut>

Начинает казаться, что регулярное выражение - неподходящий инструмент для этой работы, поэтому я хотел бы получить несколько предложений по лучшим подходам, другим инструментам или даже просто более полному регулярному выражению, которое может позволить мне решить эту проблему быстро и повторяемо.

Обновить: Проблема оказалась немного сложнее, чем предполагалось ранее.Похоже, есть также еще пара вещей, которые нуждались в защите, включая некоторый довольно неясный синтаксис, смешивание переменных с текстом в том, что кажется каким-то условным выражением.По памяти:

{o,choice|1#1  error|1&lt;{0,number,integer} errors}

Где "ошибка" и "errors" являются переводимыми и не должны быть защищены.Самое простое решение, которое у нас есть на данный момент, - это запустить вышеупомянутое регулярное выражение, исправить несколько нечетных ошибок, которые оно создает, а затем выполнить еще пару обычных проходов поиска и замены для более сложных элементов.Это можно было бы абстрагировать как регулярное выражение, но прямо сейчас в этом нет особого смысла.

Я ценю указания на xslt и другие редакторы с лучшей поддержкой регулярных выражений в дополнение к предлагаемым улучшенным выражениям.Я поиграю с некоторыми вариантами, когда позволит время.

Это было полезно?

Решение 3

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

Другие советы

Дайте мне знать, если мое предположение неверно, но из вашего примера кажется, что вы хотите изменить текст, который находится в {}, а не в элементе <ut> .Мне это кажется простым использованием XSLT.Просто выводите UT-элементы такими, какие они есть, и обрабатывайте любой промежуточный текст.

Почему бы не попробовать использовать выражение

(?<=.){[A-Za-z0-9]+}(?=.$)

Это позволило бы найти { с 1 или более буквами или цифрами и }, когда этот шаблон следует за тегом и любым количеством пробелов И сопровождается любым количеством пробелов и переносом строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top