我正在尝试使用正则表达式从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="<Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
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>
答案 0 :(得分:0)
使用\\ d $而不是\ d $ - 你想在正则表达式中使用文字\,而在C#字符串中你需要使用\\来获得它。
答案 1 :(得分:0)
可能是在字符串末尾有换行符,请尝试使用:
\.(\d+)[\r\n]*$
这将在第1组中捕获一个点之后和最终换行之前的持续数字。