.csproj ファイル内の参照で < SpecificVersion> が False に設定されていないことを検出する C# 正規表現を作成しようとしています (すべての < の後にスペースを追加して、StackOverflow で正しく表示されるようにする必要がありました)。したがって、これらは私が処理する必要があるケースです:
1. <Reference Include="IQ.MyStuff1, Version=4.1.0.0, Culture=neutral, processorArchitecture=MSIL" />
2. <Reference Include="IQ.MyStuff2, Version=4.7.22.21777, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\DebugDLLFiles\IQ.MyStuff2.dll</HintPath>
</Reference>
3. <Reference Include="IQ.MyStuff3, Version=4.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\DebugDLLFiles\IQ.MyStuff3.dll</HintPath>
<SpecificVersion>True</SpecificVersion>
</Reference>
4. <Reference Include="IQ.MyStuff4, Version=4.5.3.17401, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
</Reference>
したがって、基本的には、「< SpecificVersion>False< /SpecificVersion>」が明示的に含まれていないファイル参照です。
最初のケースは、他の 3 つのようなボディを持たず、別の方法で処理できるため、無視しましょう。だからここに私がこれまで持っているものがあります:
<Reference(\s|\n|\r)*? # Match against '<Reference '.
Include=""IQ\..*?"" # Match against the entire Include attribute; We only care about IQ DLLs.
(\s|\n\r)*?> # Eat any whitespace and match against the closing tag character.
[What should go here?]
</Reference> # Match against the closing tag.
[What should go here?] ブロックでさまざまなことを試しましたが、完全に機能するものはないようです。私が最も近づいたのは、このブロックに次を使用することでした:
(?! # Do a negative look-ahead to NOT match against this Reference tag if it already has <SpecificVersion>False</SpecificVersion>.
(.|\n|\r)*? # Eat everything before the <SpecificVersion> tag, if it even exists.
<SpecificVersion>(\s|\n|\r)*?False(\s|\n|\r)*?</SpecificVersion> # Specify that we don't want to match if this tag already has <SpecificVersion>False</SpecificVersion>.
)
(.|\n|\r)*? # Eat everything after the <SpecificVersion> tag, if it even existed.
これは、照合したいものの下に有効な参照がある場合を除いて、すべてのケースで機能します。有効な参照は次のようになります。
<Reference Include=\"IQ.MyStuff5, Version=4.5.3.17401, Culture=neutral, processorArchitecture=MSIL\">
<SpecificVersion>False</SpecificVersion>
</Reference>
私が使用している先読みは < /Reference> タグで止まらないようですが、ファイル全体を調べ続けて、その下のテキストに「< SpecificVersion>False< /SpecificVersion>」が含まれていないことを確認します。
最初に遭遇した「< /Reference>」で先読みを停止するにはどうすればよいですか。または、私の問題を解決する別の方法がある場合は、それも受け入れます。任意の提案をいただければ幸いです。ありがとう。