在hg revset中使用正则表达式

时间:2017-03-22 19:35:20

标签: regex mercurial

我读过的所有文档都说我可以使用正则表达式指定我试图使用tag()谓词的revset,使用正则表达式,例如tag('v334.\*')列出标有v3340v3349的所有版本。

https://www.mercurial-scm.org/repo/hg/help/revsets这样的页面(参见“PATTERNS”部分)中可以看出,使用正确的正则表达式语法消除了我遇到的语法错误,最好的机会似乎是:

tag(r're:v334.\*')

这至少解析了,但结果说tag 're:v334.\*' does not exist。我知道那些标签存在,我做错了什么?

更新1

首先......您的第一个回复显示re:v334不是正则表达式。我的理解是glob:前缀指定了一个简单的正则表达式,而re:前缀使用了Python正则表达式,所以它应该是re:v334.* ...是吗?

然后它就行不通了。这两种形式都是:

$ hg log -r 'tag(r"re:v334.*")'
abort: tag 're:v334.*' does not exist

$ hg log -r 'tag(r"re:v334")'
abort: tag 're:v334' does not exist 

哦,并且使用hg tags | grep v334确实显示存在这些标记。

2 个答案:

答案 0 :(得分:0)

你非常接近: - )

列出标有以v334开头的字符串的所有修订:

hg log -r 'tag(r"re:v334")'

列出标有v334的所有修订版,后跟一位数字(因此v3347会匹配但不匹配,例如v33478):

hg log -r 'tag(r"re:v334\d$")'

一些补充说明:

  • 并不总是需要正则表达式之前的r,但它永远不会受到伤害,这是指定原始字符串的Python方式。
  • $是指定正则表达式中字符串的结尾,否则它会像第一个示例中那样贪婪。

更新1

好吧,正则表达式不需要包含特殊字符作为正则表达式:-)如果你看Python documentation for regex,你会看到有两个函数,match()和{{ 1}}。 Mercurial的行为类似于search()

为了给出我的答案,我从头开始创建了一些带有一些标签的回购,所以它对我有用:

search()

我注意到另一个不同之处:如果我搜索一个不存在的标记,我会得到一个空输出,而不是你得到的$ hg log -r 'tag(r"re:v334\d$")' changeset: 1:d0b5e02bb7d9 tag: v3340 changeset: 2:566e36f5510c tag: v3344 。我可以做的最后一个建议是使用最近的mercurial。 abort告诉我4.1.1。

答案 1 :(得分:0)

我相信

hg log -r 'tag("re:v334\d")'

应该足够了。