2013-04-02 10 views
0

Я пытаюсь заменить только первое появление какого-либо текста, во-первых, изнутри онлайн-инструмента, такого как http://regexpal.com/, а затем посмотреть, работает ли это в задаче MSBUILD.RegEX - Заменить только первое вхождение текста

Я могу делать то, что я хочу в .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> 

Благодаря

ответ

3

(.+?) в регулярном выражении означает, что будет дополнительный текст после BEGIN слова, но выглядит как ваш тестовый файл заканчивается этим BEGINS - поэтому он не может соответствовать ему.

Попробуйте использовать * вместо + или добавить мусор в конец файла - в зависимости от ваших реальных потребностей.

Чтобы решить исходную задачу - использовать, например, режим SingleLine, который жадный матч остальные файла:

<FileUpdate 
    Files="@(FileToUpdate)" 
    Regex="(IF @@TRANCOUNT>0 BEGIN)(.*)" 
    ReplacementText="...I have replaced the first match only...$2" 
    Singleline="true" 
    Condition=""/> 
+0

Я собирался сказать, что это не работает, когда я добавил в $ 2 замещающий текст , и эй престо! Что делает 2 доллара, что заставляет его работать? –

+0

$ 1, $ 2 и т. Д. - это захваты, найденные регулярным выражением, поэтому $ 2 здесь '(. *)' - "все после моего' IF @@ TRANCOUNT> 0 BEGIN' " – Lanorkin

+0

Большое спасибо :) [уходит, чтобы читать на снимках. ..] –

Смежные вопросы