我正在尝试创建一个 C# 正则表达式来检测我们的 .csproj 文件中的引用何时没有将 <SpecificVersion> 设置为 False(必须在所有 <'s 之后添加一个空格才能使其在 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>”,或者如果你有另一种方法来解决我的问题,我也愿意接受。任何建议表示赞赏。谢谢。