寻找正则表达式匹配TortoiseSVN中的多个引用字符串

时间:2011-07-14 11:28:37

标签: regex version-control tortoisesvn

我们使用两种不同的方法来引用外部文档和Bugzilla错误号。

我现在正在寻找一个匹配这两种参考字符串可能性的正则表达式,以方便在TortoiseSVN 1.6.16日志屏幕中显示和链接。首先应该是[BZ#123]形式的bugzilla条目,第二个是[some text and numbers],不能转换为网址。

这可以与

匹配
\[BZ#\d+\]

\[.*?\]

我现在的问题是将这两个匹配字符串连接在一起。通常这将由正则表达式(第一个|第二个)完成,我已经这样做了:

(\[.*?\]|\[BZ#\d+\])

不幸的是,在这种情况下,TortoiseSVN似乎因为圆括号而将其全部视为错误号。即使我添加了第二个表达式(根据文档)用于提取问题编号本身,这个第二个表达式应该被忽略:

(\[.*?\]|\[BZ#\d+\])
\[BZ#(\d+)\]

在这种情况下,TortoiseSVN会在单独的列中正确显示错误和文档引用,但完全将它们用于bugtracker网址,这当然不起作用:

https://mybugzillaserver/show_bug.cgi?id=[BZ#949]

BTW,Mercurial使用{1},{2},...作为URL中的占位符,使用了更好的方法。

有人知道如何解决这个问题吗?

修改

简而言之:我们使用[BZ#123]作为错误编号引用,[anytext]作为对其他(部分非电子)文档的引用。我们希望在TortoiseSVN的额外列中列出这两种模式,但只有第一部分shpuld中的错误号用作URL字符串中的%BUGID%。

编辑2

据说TortoiseSVN无法处理嵌套的正则表达式组(圆括号),所以此问题目前没有任何令人满意的答案。

1 个答案:

答案 0 :(得分:1)

我不熟悉TortoiseSVN正则表达式,但看起来问题是正则表达式的第一部分([.*?\])总是匹配,所以你永远不会到达评估第二部分的部分部分,\[BZ#(\d+)\]

试试这个:

((?<=\[BZ#)\d+(?=\])|\[.*?\])

说明:

(           #Opening group.
(?<=\[BZ#)  #Look behind for a bugzilla placeholder.
\d+         #Capture just the digits.
(?=\])      #Look ahead for the closing bracket (probably not necessary.)
|           #Or, if that fails,
\[.*?\]     #Find all other placeholders.
)           #Closing the group.

编辑:我刚看过TortoiseSVN文档。您也可以尝试保持Message part expression相同,但将Bug-ID expression更改为:

(?<=\[BZ#)(\d+)(?=\])

编辑: ?<=表示零宽度的后视广告。见http://www.regular-expressions.info/lookaround.html。 TortoiseSVN可能不支持lookbehinds。

如果您只为(\d+)使用Bug-ID expression会怎样?