MSBuild RegexMatch不匹配

时间:2012-10-19 11:12:18

标签: regex msbuild

我有以下

<RegexMatch Input="$(Configuration)" Expression="^.*?(?=\.)">
   <Output ItemName="Theme" TaskParameter="Output" />
</RegexMatch>

我的配置变量如下:Theme.Environment

所以“Default.Debug” 或“黄色。发布”

我想把第一部分放到可变的主题中。 我已经测试了这个正则表达式,它可以在独立的正则表达式测试器中运行

^.*?(?=\.)

但在我的构建文件中使用时却没有。

我正在回显变量,以便我可以看到输出

<Exec Command="echo $(Theme)"/>
<Exec Command="echo $(Configuration)"/>

想法?

2 个答案:

答案 0 :(得分:2)

如果您应该使用MSBuild社区任务 - 请检查以下行:<Output PropertyName="Theme" TaskParameter="Output" />

如果您想稍后引用PropertyName="Theme",请使用$(Theme)ItemName将创建项目集,而不是属性。

但使用MSBuild 4.0内联函数比使用Msbuild社区任务更简单。您的代码将如下所示(适用于您的脚本):

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTarget="Play">
  <PropertyGroup>
    <Configuration>Yellow.Release</Configuration>
  </PropertyGroup>


  <Target Name="Play">

    <PropertyGroup>
      <Theme>$([System.Text.RegularExpressions.Regex]::Match($(Configuration), `^.*?(?=\.)`))</Theme>
    </PropertyGroup>

    <Message Text="$(Theme)" />
    <Message Text="$(Configuration)" />
  </Target>
</Project>

答案 1 :(得分:0)

刚刚意识到RegexMatch会返回匹配的字符串,但如果匹配则会返回整个字符串。

基本上它叫做IsMatch方法而不是匹配方法

重新编写为RegexReplace

<RegexReplace Input="$(Configuration)" Expression="\..*" Replacement="" Count="1">
    <Output ItemName="Theme" TaskParameter="Output" />
</RegexReplace>

之后它仍然没有工作,然后我意识到我正在做

$(Theme)

应该是

@(Theme)