regexIssueTracker无法在CruiseControl.net中运行

时间:2010-04-06 19:03:29

标签: regex cruisecontrol.net

我正在尝试使用issueUrlBuilder在我的CruiseControl.NET配置中工作,并且无法弄清楚它们为什么不起作用。

我试过的第一个就是:

<cb:define name="issueTracker">
  <issueUrlBuilder type="regexIssueTracker">
    <find>^.*Issue (\d*).|\n*$</find>
    <replace>https://issuetracker/ViewIssue.aspx?ID=$1</replace>
  </issueUrlBuilder>
</cb:define>

然后,我在sourceControl块中引用它:

  <sourcecontrol type="vaultplugin">
    ...
    <issueTracker/>
  </sourcecontrol>

我的签到评论如下:

[Issue 1234] This is a test comment

我无法在构建报告/日志/等中找到任何地方。将问题链接转换为链接的位置。我的正则表达式错了吗?

我也尝试过默认的issueUrlBuilder:

<cb:define name="issueTracker">
  <issueUrlBuilder type="defaultIssueTracker">
    <url>https://issuetracker/ViewIssue.aspx?ID={0}</url>
  </issueUrlBuilder>
</cb:define>

同样,相同的评论和任何地方都没有链接。

任何人都有任何想法。

1 个答案:

答案 0 :(得分:2)

您似乎尝试使用.|\n而非.来匹配可能的多行注释,默认情况下,它与新行不匹配。您的第一个问题是|所有正则表达式构造的关联性最低,因此它将整个正则表达式划分为替代^.*Issue (\d*).\n*$。您需要将替换括在一个组中:(?:.|\n)*

另一个潜在的问题是这些行可能被\r\n(回车加换行)而不仅仅是\n分开。如果CCNET使用.NET正则表达式引擎,那将不会有问题,因为点匹配\r。但是并非所有风格都是如此,无论如何,总有一种更好的方式来匹配包括换行符在内的任何内容而不是(?:.|\n)*。我建议你试试

<find>^.*Issue (\d*)(?s:.*)$</find>

<find>(?s)^.*Issue (\d*).*$</find>

(?s)(?s:...)inline modifiers,允许点与行分隔符匹配。


编辑:看起来这是CCNET中的known bug。如果内联修饰符不起作用,请尝试将.替换为[\s\S],就像在JavaScript正则表达式中一样。例如:

<find>^.*Issue (\d*)[\s\S]*$</find>