首页 > 解决方案 > 什么是有效 Git 标签的正则表达式?

问题描述

这个问题解释了什么是 Git 中的有效标签。但是,是否存在遵循这些规则的经过良好测试且广泛使用的正则表达式?

什么是有效 Git 标签的正则表达式?

标签: regexgit

解决方案


以下是我将这些规则转换为 Perl 正则表达式的方法:

my $base = qr{ [!"#\$%&'()+,\-0-9;<=>\@A-Z\]_`a-z{|}] }x;

这是允许的基本集中单个字符的正则表达式。如果您想将其翻译成另一种语言/正则表达式方言,请注意,$并且@仅在此处转义,因为它们会触发 Perl 中的变量插值。

这是一个白名单,因为我发现以这种方式思考事情更容易。作为副作用,这也不允许任何非 ASCII 字符。

如果您想允许完整的 Unicode 集,黑名单变得更容易使用:

my $base = qr{ [^\x00-\x20\x1f~^:?*\[\\] }x;

(或者qr{ [^\x00-\x20\x1f~^:?*\[\\\@] | \@ (?! \{ ) }x对于包含@{限制的版本;见下文。)

my $part = qr{ $base+ (?: \. $base+ )* \.? (?<! \.lock ) }x;

这匹配单个斜线分隔的部分。它实现了部件不能以 开头、.包含..或结尾的限制.lock

my $full_ref = qr{\A (?! \@ \z | .* \@\{ ) $part (?: / $part )+ (?<! \. ) \z}sx;

这匹配完整的参考。它增加了一些额外的限制:

  • 整件事不可能@。(这条规则在技术上是多余的,因为我们总是需要 a /,但我还是把它包括在内了。)

  • @{不可能在任何地方发生。我们也可以这样修改,而不是单独的前瞻检查$base

    my $base = qr{ [!"#\$%&'()+,\-0-9;<=>A-Z\]_`a-z{|}] | \@ (?! \{ ) }x;
    
  • 必须至少有两个部分,以 . 分隔/

  • 整件事不能以..

翻译成例如 C# 留给读者作为练习。:-)


推荐阅读