我们使用两种不同的方法来引用外部文档和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无法处理嵌套的正则表达式组(圆括号),所以此问题目前没有任何令人满意的答案。
答案 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
会怎样?