问题描述
在GitLab中,我有一个类似这样的规则:
- if: '$CI_COMMIT_TITLE =~ /^(fix|feat|perf|docs|build|test|ci|refactor)\S*:/'
我注意到^
在多行正则表达式中并不匹配任何行的开头,只匹配第一行的开头。这引发了以下问题:
– 是否有任何内容匹配换行符?
– 是否有多行正则表达式模式?
– GitLab的正则表达式文档在哪里?他们使用哪种正则表达式实现?
解决方案
请注意以下操作可能涉及版本差异及潜在变化。
GitLab使用了Ruby的正则表达式引擎,其核心实现是Onigmo(Oniguruma-mod)。你可以在Ruby的regex.c源代码中找到相关信息。
关于官方文档,你可以在这里找到更多信息:https://github.com/k-takata/Onigmo/blob/master/doc/RE。
最佳回答
根据用户投票,下面是关于GitLab正则表达式引擎的更新回答,根据这些文档:
在GitLab 11.9.4中,GitLab开始将only
和except
关键字中使用的正则表达式内部转换为RE2。
由于计算复杂性,RE2限制了可用特性的集合,一些特性(如负向先行断言)不再可用。现在只支持Ruby正则表达式提供的特性子集。
从GitLab 11.9.7到GitLab 14.9,GitLab提供了一个功能标志,允许您使用不安全的正则表达式语法。我们现在完全迁移到了RE2,该功能标志不再可用。
对于像您使用的rules
和if
一样,情况也是如此。
简而言之,GitLab正则表达式现在使用了Google的RE2语法,而不是Ruby。
以上是关于GitLab正则表达式引擎的信息。根据你的需求,你可以选择使用Ruby的Onigmo引擎或GitLab内部采用的RE2引擎来处理正则表达式。请根据你的情况和需求选择合适的引擎。