regex - 什么是有效 Git 标签的正则表达式?
解决方案
以下是我将这些规则转换为 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# 留给读者作为练习。:-)
推荐阅读
- python - 迭代至小数点后 12 位
- excel - 如何在 Excel 或 Powershell 中根据 IP 地址搜索域名?
- php - laravel 无法发送电子邮件,也不是错误
- javascript - 有没有可能的方法将它绑定到使用 vue 方法的事件中?
- jquery - 如何在此计算器中添加两个功能?(1) 如何添加第一个方程答案的新值?(2)如何用新值替换eval值?
- powershell - 如何在 PowerShell 中找到部分路径的潜在源环境变量?
- reactjs - TypeError:Events.map 不是函数
- reactjs - 我可以将 Auth0 sdk 与有状态组件一起使用吗?
- android - 当我在 android 中使用特殊的底部导航栏时,键盘无法打开
- javascript - React Native Square 应用内支付,出现问题,代码:unexpected