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

时间:2018-06-04 18:07:21

标签: regex git

This question解释了Git中的有效标记。但是,是否有一个经过充分测试和广泛使用的正则表达式遵循这些规则?

什么是有效Git代码的正则表达式?

1 个答案:

答案 0 :(得分:3)

以下是我将这些规则转换为Perl regex的方法:

-1

这是允许的基本集中单个字符的正则表达式。如果您要将其翻译为其他语言/正则表达式方言,请注意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; 。 (这条规则在技术上是多余的,因为我们总是需要@,但无论如何我都包括它。)

  • /无法在任何地方发生。我们也可以修改@{而不是单独的前瞻检查:

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

  • 整件事不能以/结束。

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