正则表达式,反向引用和替代

时间:2018-10-21 19:33:47

标签: regex search replace notepad++ backreference

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

  <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 :(得分:2)

仅当字符串始终以相同的格式格式化时,才可以修改第一个正则表达式来为您完成全部工作:

查找内容(<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 demo

详细信息

  • (<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-从上面的描述中已经很清楚了。