MSBuild System.Text.RegularExpressions.Regex不匹配

时间:2014-03-07 11:53:42

标签: regex msbuild

我正在尝试使用正则表达式从1.2.3这样的字符串中提取最终数字,但似乎无法做到。

我认为使用\d$就足够了,但在以下MSBuild文件中使用正则表达式时它不起作用:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <AssemblyVersion>1.5.0</AssemblyVersion>
    </PropertyGroup>
    <Target Name="TestXmlPeek">
        <XmlPeek 
            Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;" 
            XmlInputPath="$(MSBuildProjectFile)" 
            Query="/msb:Project/msb:PropertyGroup/msb:AssemblyVersion/text()">
            <Output TaskParameter="Result" ItemName="Peeked" />
        </XmlPeek>

        <Message Text="@(Peeked)"/>

        <PropertyGroup>
            <Out>$([System.Text.RegularExpressions.Regex]::Match(@(Peeked), `\d$`))</Out>
        </PropertyGroup>

        <Message Text="Input: [@(Peeked)] Output: [$(Out)]"/>
    </Target>   
</Project>

当我运行TestXmlPeek目标时,我看到以下输出:

TestXmlPeek:
  1.5.0   
  Input: [1.5.0] Output: []

有人可以告诉我这里做错了吗?

(顺便说一下:我正在这样做,因为我想使用MSBuild目标来最终增加我的版本号。)

修改

我很确定MSBuild和regex正在运行,好像我使用下面的简单表达式,我确实看到它与整个字符串匹配并打印出1.5.0

<Out>$([System.Text.RegularExpressions.Regex]::Match(@(Peeked), `.*`))</Out>

2 个答案:

答案 0 :(得分:0)

使用\\ d $而不是\ d $ - 你想在正则表达式中使用文字\,而在C#字符串中你需要使用\\来获得它。

答案 1 :(得分:0)

可能是在字符串末尾有换行符,请尝试使用:

\.(\d+)[\r\n]*$

这将在第1组中捕获一个点之后和最终换行之前的持续数字。