【发布时间】:2016-05-13 17:03:36
【问题描述】:
我正在尝试使用这个正则表达式:
^(\s+)<ProjectReference(.|\s)+?(Project2)</Name>(.|\s)+?</ProjectReference>
...仅定位此部分:
<ProjectReference Include="..\..\Project2\Project2.csproj">
<Project>{6c2a7631-8b47-4ae9-a68f-f728666105b9}</Project>
<Name>Project2</Name>
</ProjectReference>
...在下面的文档中:
what is causing this text up here to be selected??
<ProjectReference Include="..\..\Project1\Project1\Project1.csproj">
<Project>{714c6b26-c609-40a4-80a9-421bd842562d}</Project>
<Name>Project1</Name>
</ProjectReference>
<ItemGroup>
<ProjectReference Include="..\..\Project2\Project2.csproj">
<Project>{6c2a7631-8b47-4ae9-a68f-f728666105b9}</Project>
<Name>Project2</Name>
</ProjectReference>
<ProjectReference Include="..\..\Project3\Project3\Project3.csproj">
<Project>{39860208-8146-429f-a1d1-5f8ed2fd7f5f}</Project>
<Name>Project3</Name>
</ProjectReference>
<ProjectReference Include="..\..\Project4\Project4.csproj">
<Project>{58144d60-19d9-4d11-8ae6-088e03ccf874}</Project>
<Name>Project4</Name>
</ProjectReference>
<ProjectReference Include="..\..\Project5\Project5.csproj">
<Project>{33baa509-ad24-4a72-a2fc-8f297e75e90d}</Project>
<Name>Project5</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
在 Notepad++ 中,它似乎最初会找到匹配项,但随后会在第二个匹配项中继续匹配整个文档(因此它总共找到 2 个匹配项)。我最初在我的 .NET 应用程序中发现了这一点,当时我的实用程序将项目文件的全部内容替换为空字符串,从而有效地清除了整个内容。
我已经花了一个多小时来解决这个问题,所以让我们看看 SE 是否可以解决这个问题。
更新:虽然我已经标记了一个实际有效的答案,但我最终还是采用了一种不那么神奇的方法来确保以后不会有罕见的正则表达式怪癖潜入我的代码就像最近的情况一样。
^(\s+)<ProjectReference.+?({0})\.(csproj|vbproj).*\r\n.*\r\n\s+<Name>{0}</Name>\r\n\s*</ProjectReference>
...{0} 是我的项目的名称。虽然更冗长,但此解决方案不太可能因过度匹配而出错。我在我的 .NET 应用程序中使用 RegexOptions.Multiline,以便我可以锚定到行首。
【问题讨论】:
-
这个
(.|\r\n)+。贪婪的.会捕获一切。 -
@BoristheSpider 糟糕,在撰写我的问题时编辑错误。我用
?纠正了它,但它仍然在做同样的事情。我直接从我的 Notepad++ 查找窗口中复制并粘贴了该正则表达式。 -
您似乎想提取与
project2相关的部分。为什么不使用 xpath 表达式或 xml 解析器? -
@FedericoPiazza 我想我可以。我正在尝试用 DLL 引用替换项目引用,而正则表达式只是我能想到的第一种方法。我选择它是因为我对正则表达式很满意,而且不需要学习任何新东西。
-
@oscilatingcretin,好的。所以,要确保你只想要上面提到的与
Project2\Project2.csproj相关的特定部分?
标签: regex