我正在尝试仅替换某些文本的第一次出现,首先是在http://regexpal.com/等在线工具中,然后查看这是否适用于MSBUILD任务。
我可以在.net中做我想做的事情:
StringBuilder sb = new StringBuilder();
sb.Append("IF @@TRANCOUNT>0 BEGIN");
sb.Append("IF @@TRANCOUNT>0 BEGIN");
sb.Append("IF @@TRANCOUNT>0 BEGIN");
Regex MyRgx = new Regex("IF @@TRANCOUNT>0 BEGIN");
string Myresult = MyRgx.Replace(sb.ToString(), "foo", 1);
如上所述,让这个在MSBUILD任务中工作是我的最终目标。我最接近的是替换掉除最后一个之外的所有东西(诚然,它们并不紧密!)
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<ItemGroup>
<SourceFile Include="source.txt" />
<FileToUpdate Include="FileToUpdate.txt" />
</ItemGroup>
<Target Name="go">
<!-- a) Delete our target file so we can run multiple times-->
<Delete Files="@(FileToUpdate)" />
<!-- b) Copy the source to the version we will amend-->
<Copy SourceFiles= "@(SourceFile)"
DestinationFiles="@(FileToUpdate)"
ContinueOnError="false" />
<!-- c) Finally.. amend the file-->
<FileUpdate
Files="@(FileToUpdate)"
Regex="IF @@TRANCOUNT>0 BEGIN(.+?)"
ReplacementText="...I have replaced the first match only..."
Condition=""/>
<!-- NB The above example replaces ALL except the last one (!)-->
</Target>
</Project>
由于
答案 0 :(得分:3)
(.+?)
表示在BEGIN
字后会有其他文字,但看起来您的测试文件只是以BEGINS
结尾 - 所以它无法与之匹配。
尝试使用*
代替+
,或在文件末尾添加一些垃圾 - 取决于您的实际需求。
要解决您的初始任务 - 请使用例如单线模式,该模式贪婪地匹配文件的其余部分:
<FileUpdate
Files="@(FileToUpdate)"
Regex="(IF @@TRANCOUNT>0 BEGIN)(.*)"
ReplacementText="...I have replaced the first match only...$2"
Singleline="true"
Condition=""/>