2

我徒劳地尝试编写一个正则表达式,如果在单行 XLIFF 的 <target> XML 节点中找到给定的子字符串“/oem/en”(后跟正斜杠或双引号),则该正则表达式只会返回匹配项代码。到目前为止,我得到了什么,但它仍然匹配 <source> 节点中的偶数:

/oem/en(?=/|\")(?=.*?</target>)

带有 <source> 和 <target> 节点的 XLIFF 代码示例:

<?xml version="1.0" encoding="utf-8"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file product-version="1.4" original="" source-language="default" target-language="default" datatype="plaintext" category="page_content"><header></header><body><trans-unit id="page_description" datatype="x-System.String" maxwidth="0" minwidth="0"><source><![CDATA[bla bla]]></source><target><![CDATA[translated bla bla]]></target></trans-unit><trans-unit id="f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8" datatype="x-System.String" resname="PublishingPageContent" maxwidth="0" minwidth="0"><source><![CDATA[<a href="/oem/en/link1">bla bla</a>]]></source><target><![CDATA[<a href="/oem/en/link1/>translated bla bla</a>]]></target></trans-unit><trans-unit id="f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8" datatype="x-System.String" resname="PublishingPageContent" maxwidth="0" minwidth="0"><source><![CDATA[<a href="/oem/en/link2">bla bla</a>]]></source><target><![CDATA[<a href="/oem/en/link2/>translated bla bla</a>]]></target></trans-unit></body></file></xliff>

我的方法是尝试制作一个向前看的表达式,直到它与 </source> 或 </target> 匹配,如果它首先找到前者,这意味着我们在 <source> 节点中,因此它不是一场比赛。

非常感谢您对此的帮助!

4

2 回答 2

3

描述

/oem/en如果字符串在目标标记内,此表达式将只查找字符串

正则表达式:(<target>(?:(?!<\/target>).)*?)(\/oem\/en(?=\/|\"))

用。。。来代替:$1~~~~New Value~~~~~

在此处输入图像描述

C# 代码示例

输入文本

<?xml version="1.0" encoding="utf-8"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file product-version="1.4" original="" source-language="default" target-language="default" datatype="plaintext" category="page_content"><header></header><body><trans-unit id="page_description" datatype="x-System.String" maxwidth="0" minwidth="0"><source><![CDATA[bla bla]]></source><target><![CDATA[translated bla bla]]></target></trans-unit><trans-unit id="f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8" datatype="x-System.String" resname="PublishingPageContent" maxwidth="0" minwidth="0"><source><![CDATA[<a href="/oem/en/link1">bla bla</a>]]></source><target><![CDATA[<a href="/oem/en/link1/>translated bla bla</a>]]></target></trans-unit><trans-unit id="f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8" datatype="x-System.String" resname="PublishingPageContent" maxwidth="0" minwidth="0"><source><![CDATA[<a href="/oem/en/link2">bla bla</a>]]></source><target><![CDATA[<a href="/oem/en/link2/>translated bla bla</a>]]></target></trans-unit></body></file></xliff>

代码

using System;
using System.Text.RegularExpressions;
namespace myapp
{
  class Class1
    {
      static void Main(string[] args)
        {
          String sourcestring = "source string to match with pattern";
          String matchpattern = @"(<target>(?:(?!<\/target>).)*?)(\/oem\/en(?=\/|\""))";
          String replacementpattern = @"$1~~~~~new value~~~~~";
          Console.WriteLine(Regex.Replace(sourcestring,matchpattern,replacementpattern,RegexOptions.IgnoreCase));
        }
    }
}

产量

<?xml version="1.0" encoding="utf-8"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file product-version="1.4" original="" source-language="default" target-language="default" datatype="plaintext" category="page_content"><header></header><body><trans-unit id="page_description" datatype="x-System.String" maxwidth="0" minwidth="0"><source><![CDATA[bla bla]]></source><target><![CDATA[translated bla bla]]></target></trans-unit><trans-unit id="f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8" datatype="x-System.String" resname="PublishingPageContent" maxwidth="0" minwidth="0"><source><![CDATA[<a href="/oem/en/link1">bla bla</a>]]></source><target><![CDATA[<a href="~~~~~new value~~~~~/link1/>translated bla bla</a>]]></target></trans-unit><trans-unit id="f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8" datatype="x-System.String" resname="PublishingPageContent" maxwidth="0" minwidth="0"><source><![CDATA[<a href="/oem/en/link2">bla bla</a>]]></source><target><![CDATA[<a href="~~~~~new value~~~~~/link2/>translated bla bla</a>]]></target></trans-unit></body></file></xliff>

于 2013-06-21T13:44:16.553 回答
1

如果不需要 CDATA 部分,我认为这是不可靠的。

下面是正则表达式。它找到目标标记后跟 CDATA。然后它匹配任何没有后跟 CDATA close ]] 的字符。 只要没有遇到 ]],/oem/en就会匹配。我相信 C# 支持否定前瞻和非捕获组。显然,否定的前瞻性是必不可少的。

<target><!\[CDATA\[(?:.(?!\]\]))*(/oem/en)

如果您需要适应具有参数的目标,您可以执行类似<target[^>]*>. 如果目标和 CDATA 之间有空格,则 `\w*

我有一个非常 alpha 的正则表达式编辑器,但您可以在以下位置对其进行测试:http ://rey.gimenez.biz/

于 2013-06-21T13:54:25.313 回答