Regex, обратные ссылки и чередования - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь изменить некоторые тексты с помощью регулярных выражений.Это оригинальный текст:

  <text xml:lang="en">"Insert Swab to Start Analysis"</text>
  <text xml:lang="es"></text>
  <text xml:lang="fr"></text>
  <text xml:lang="de"></text>
  <text xml:lang="pt"></text>
  <text xml:lang="du"></text>

И это нужный текст:

  <en>"Insert Swab to Start Analysis"</en>
  <es>"Insert Swab to Start Analysis"</es>
  <fr>"Insert Swab to Start Analysis"</fr>
  <de>"Insert Swab to Start Analysis"</de>
  <pt>"Insert Swab to Start Analysis"</pt>
  <du>"Insert Swab to Start Analysis"</du>

Как вы можете видеть, произошли два изменения: измените теги и скопируйте исходный текст вцелевые языки.

Мне удалось сделать это с помощью двух разных регулярных выражений.

Первое регулярное выражение (скопировать исходный текст на целевые языки):

Search: (<text xml:lang=)"en">(.+?)(</text>)\r\n  \1"es">\3\r\n  \1"fr">\3\r\n  \1"de">\3\r\n  \1"pt">\3\r\n  \1"du">\3
Replace: \1"en">\2\3\r\n  \1"es">\2\3\r\n  \1"fr">\2\3\r\n  \1"de">\2\3\r\n  \1"pt">\2\3\r\n  \1"du">\2\3

Второе регулярное выражение (изменитьтеги):

Search: <text xml:lang="(en|es|fr|de|pt|du)">(.*?)(</[^>]*>)
Replace: <\1\>\2</\1>

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

PD: Я просто использую Notepad ++ для всего этого.

PD: Это большой XML-файл с большим количеством записей, не только тот, который я показываю вам здесь.

1 Ответ

0 голосов
/ 27 октября 2018

Только если строка всегда отформатирована одинаково, вы можете просто изменить первое регулярное выражение, чтобы сделать всю работу за вас:

Найти что :(<text xml:lang=")en">(.+?)(</text>)\R \1es">\3\R \1fr">\3\R \1de">\3\R \1pt">\3\R \1du">\3 Заменить на : <en>\2</en>\r\n <es>\2</es>\r\n <fr>\2</fr>\r\n <de>\2</de>\r\n <pt>\2</pt>\r\n <du>\2</du>

См. Демоверсию regex

Подробности

  • (<text xml:lang=") - группа 1 (обозначается \1): буквенный текст <text xml:lang="
  • en"> - буквальный текст en">
  • (.+?) - группа 2: любая 1или больше символов, кроме символов разрыва строки, как можно меньше
  • (</text>) - группа 3: буквенный текст </text>
  • \R - любая последовательность разрыва строки
  • - два пробела
  • \1 - текст, захваченный в группе 1
  • es"> - буквальный текст es">
  • \3 - текств группе 3
  • \R \1fr">\3\R \1de">\3\R \1pt">\3\R \1du">\3 - это уже ясно из приведенного выше описания.
...