我试图使用正则表达式从像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: []
型
有人能告诉我我做错了什么吗?
(BTW:我这样做是因为我想使用MSBuild目标来最终增加我的版本号。
编辑
我很确定MSBuild和regex是工作的,如果我使用下面的simply表达式,我确实看到它匹配整个字符串并打印出1.5.0
。
<Out>$([System.Text.RegularExpressions.Regex]::Match(@(Peeked), `.*`))</Out>
型
3条答案
按热度按时间t98cgbkg1#
问题是
@(Peeked)
在传递给属性函数时,不知何故并没有简单地转换为包含字符1.5.0
的字符串。我承认我没有检查它实际上做了什么,但这并不意味着修复不起作用:]首先将其转换为字符串:字符串
(我在这里使用了
""
,但````也可以工作)oaxa6hgo2#
使用\d$而不是\d$ --你需要在正则表达式中有一个文字,而在C#字符串中你需要使用\来获得它。
kzmpq1sx3#
如果你在字符串的末尾有一个换行符,可以试试:
字符串
这将在组1中捕获点之后和最终换行符之前的最后一个数字。