正则表达式、反向引用和交替

Regex, backreferences and alternations

我正在尝试使用正则表达式修改一些文本。这是原文:

  <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  "es">\r\n  "fr">\r\n  "de">\r\n  "pt">\r\n  "du">
Replace: "en">\r\n  "es">\r\n  "fr">\r\n  "de">\r\n  "pt">\r\n  "du">

第二个正则表达式(更改标签):

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

我对结果很满意,但我想知道是否所有这些都可以使用一个正则表达式而不是两个来完成。我使用的第二个正则表达式非常优雅,但它不会将源文本复制到不同的目标语言中。我怀疑它需要一些小技巧才能正常工作。建议?

PD:我只是用 Notepad++ 来做这一切。

PD:这是一个很大的 XML 文件,有很多条目,不仅仅是我在这里给你看的那个。

只有当字符串总是格式相同时,您才可以修改第一个正则表达式来为您完成整个工作:

查找内容(<text xml:lang=")en">(.+?)(</text>)\R es">\R fr">\R de">\R pt">\R du">
替换为<en></en>\r\n <es></es>\r\n <fr></fr>\r\n <de></de>\r\n <pt></pt>\r\n <du></du>

regex demo

详情

  • (<text xml:lang=") - 第 1 组(用 </code> 表示):文字 <code><text xml:lang="
  • en"> - 文字 en">
  • (.+?) - 第 2 组:除换行字符外的任何 1 个或多个字符,尽可能少
  • (</text>) - 第 3 组:文字 </text>
  • \R - 任何换行序列
  • - 两个空格
  • </code> - 第 1 组中捕获的文本</li> <li><code>es"> - 文字 es">
  • </code> - 第 3 组中捕获的文本</li> <li><code>\R fr">\R de">\R pt">\R du"> - 从上面的描述中已经很清楚了。