【问题标题】:Regex, backreferences and alternations正则表达式、反向引用和交替
【发布时间】:2019-03-25 22:10:33
【问题描述】:

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

  <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 文件,而不仅仅是我在这里向您展示的那个。

【问题讨论】:

  • 如果你的第一个正则表达式适合你(注意这是一个非常脆弱的方法),你可以修改它来完成整个工作。喜欢this
  • 是的,它运作良好,谢谢。

标签: regex search replace notepad++ backreference


【解决方案1】:

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

查找内容(&lt;text xml:lang=")en"&gt;(.+?)(&lt;/text&gt;)\R \1es"&gt;\3\R \1fr"&gt;\3\R \1de"&gt;\3\R \1pt"&gt;\3\R \1du"&gt;\3
替换为&lt;en&gt;\2&lt;/en&gt;\r\n &lt;es&gt;\2&lt;/es&gt;\r\n &lt;fr&gt;\2&lt;/fr&gt;\r\n &lt;de&gt;\2&lt;/de&gt;\r\n &lt;pt&gt;\2&lt;/pt&gt;\r\n &lt;du&gt;\2&lt;/du&gt;

regex demo

详情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多