This question解释了Git中的有效标记。但是,是否有一个经过充分测试和广泛使用的正则表达式遵循这些规则?
什么是有效Git代码的正则表达式?
答案 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#留给读者练习。 : - )