この質問には3年ほど遅れていますが、実際にこのタスクに使用できるPerl正規表現があります。
検索用語自体は、他のテキストエディタを使用して、Perlの正規表現をサポートして最も可能性の高いものWindows v21.10.0.1032ためウルトラエディットで可能とするための上記で定義した通りrelation
同じtermName
を含むterm
ブロックを削除する場合をセンシティブPerl正規表現検索文字列で置き換えます。
^[ \t]*<term>(?:(?!</term>)[\S\s])+<termName>([^\r\n]+?)</termName>(?:(?!</term>)[\S\s])+<relation>(?:(?!</term>)[\S\s])+<termName>\1</termName>(?:(?!</term>)[\S\s])+</term>[ \t\r]*\n
置換文字列は空の文字列です。
説明:
^
...行頭のすべての検索を開始します。
[ \t]*
...行の先頭に0個以上の空白またはタブがある可能性があります。
<term>
...この文字列は、次の行で見つかる必要があります。
次はトリッキーな表現は、関心の次の文字列までが、残りの式は、現在のterm
ブロックに肯定的な結果を返さない場合は、次のterm
ブロックで何かを一致避けて任意の文字を一致させるために必要とされる次の。
(?:(?!</term>)[\S\s])+
...この式では、空白以外の文字または空白文字に一致する[\S\s]
があるため、任意の文字が検出されます。 +
のため、次の固定文字列の前に少なくとも1文字は必要ですが、それ以上の文字でもかまいません。さらに、Perlの正規表現は、</term>
が後に続くかどうかを調べるために一致するすべての文字を先読みする必要があります。現在一致している文字の右側に文字列</term>
がある場合、Perl正規表現エンジンはstreamの現在の位置にある文字との一致を停止し、検索文字列の次の部分で続行する必要があります。したがって、この式は任意の文字に一致することができますが、</term>
を超えないため、<term>
と</term>
の間の文字のみに一致することはありません。 ?:
のため、この式で逆参照するためにキャプチャ/マークはありません。
<termName>
... term
ブロック内のこの固定文字列を次に見つけなければなりません。
([^\r\n]+?)
...用語の名前の文字と一致し、後方参照のためにこの文字列をキャプチャ/マークします。負の文字クラス式[^\r\n]
の代わりに、別のクラス定義を使用することもできます。ドットが改行文字と一致しない場合は、.
を使用することもできます。エンコードされていない括弧で囲まれていない括弧が用語名の一部であることができない場合は、([^<]+)
も可能です。文字<
は、CDATAブロック内を除いて要素の値内でXML仕様に従って<
でエンコードする必要があります。
</termName>
... term
ブロック内のこの固定ストリングは、次に見つかる必要があります。
(?:(?!</term>)[\S\s])+
... term
ブロック内の任意の文字ブロック次の固定文字列まで。
<relation>
... term
ブロック内のこの固定文字列を次に見つけなければなりません。
(?:(?!</term>)[\S\s])+
... term
ブロック内の任意の文字ブロック次の固定文字列まで。
<termName>
... term
ブロック内のこの固定文字列を次に見つけなければなりません。
\1
...この式はキャプチャされた/マークされた用語名を参照するため、次の文字列は上記で定義した用語の名前と同じでなければなりません。
</termName>
... term
ブロック内のこの固定ストリングは、次に見つかる必要があります。
(?:(?!</term>)[\S\s])+
... term
ブロック内の任意の文字ブロック次の固定文字列まで。
</term>
... term
ブロックのこの固定ストリングマーキングエンドは、次に見つかるはずです。
[ \t\r]*\n
... 0個以上のスペース、タブ、キャリッジリターン、次の改行に一致します。したがって、この式はDOS/Windows(CR + LF)とUnix(LFのみ)テキストファイルで動作します。ウルトラエディットとも
可能です:
(?s)^[ \t]*<term>(?:(?!</term>).)+<termName>([^<]+?)</termName>(?:(?!</term>).)+<relation>(?:(?!</term>).)+<termName>\1</termName>(?:(?!</term>).)+</term>[ \t\r]*\n
(?s)
...検索文字列の先頭で、この表現は、任意の文字、したがって、.
は今、本当ににラインターミネータ以外の任意の文字にマッチするから.
の動作を変更します[\S\s]
のように。
あなたの記事を今3回読むと、達成したいことが得られません。 「後」のリストを追加できますか?どのOSをお使いですか? "in = the"の部分が私を混乱させるならば、それを伝えなさい... –
申し訳ありません、これについて。非優先の用語は、異なる名称の好ましい用語を示唆すべきである。でこれを行い、使用する優先語のIDと名前を指定します。上記の例では、xmlはシステムに、優先されていない用語と同じ名前を使用するように指示しています。だから、検索と置換は、これらの2つのプロパティの値が同じであった場所を見つけ、どこにあったのかを調べて全体の用語を削除します。したがって、上記の例では、全体の用語が削除されます。 relationのtermNameの値が異なる場合、何も変更されません。 –
Charlie
私は窓にいますが、必要に応じてMacを使用できます。したがって、上の例では、relationのtermName =のtermNameのため、全体がdeltetedされます。彼らが異なっていれば、何も変わらないでしょう。 –
Charlie