2

指定された部分文字列「/oem/en」(その後にスラッシュまたは二重引用符が続く) が単一行 XLIFF の <target> XML ノードで見つかった場合にのみ一致を返す正規表現を作成しようとしても無駄ですコード.これまでのところ、私が得たものはまだ <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[^>]*>。target と CDATA の間に空白がある場合は、`\w*

私は非常にアルファ版の正規表現エディターを持っていますが、http: //rey.gimenez.biz/でテストできます。

于 2013-06-21T13:54:25.313 に答える