MSBuild System.Text.RegularExpressions.Regex不匹配

mbyulnm0  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(89)

我试图使用正则表达式从像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: []


有人能告诉我我做错了什么吗?
(BTW:我这样做是因为我想使用MSBuild目标来最终增加我的版本号。

编辑

我很确定MSBuild和regex是工作的,如果我使用下面的simply表达式,我确实看到它匹配整个字符串并打印出1.5.0

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

t98cgbkg

t98cgbkg1#

问题是@(Peeked)在传递给属性函数时,不知何故并没有简单地转换为包含字符1.5.0的字符串。我承认我没有检查它实际上做了什么,但这并不意味着修复不起作用:]首先将其转换为字符串:

<Project ToolsVersion="4.0" DefaultTargets="TestXmlPeek">
<ItemGroup>
    <Peeked Include="1.5.0"/>
</ItemGroup>
<Target Name="TestXmlPeek">
    <PropertyGroup>
        <JustText>@(Peeked)</JustText>
        <Out>$([System.Text.RegularExpressions.Regex]::Match($(JustText), "\d$"))</Out>
    </PropertyGroup>
    <Message Text="Match: $(Out)"/>
</Target>   
</Project>

字符串
(我在这里使用了"",但````也可以工作)

oaxa6hgo

oaxa6hgo2#

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

kzmpq1sx

kzmpq1sx3#

如果你在字符串的末尾有一个换行符,可以试试:

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

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

相关问题