git 提交消息的 Bash 前瞻正则表达式不起作用"^[A-Z](?!.*ed).*$"



我正在尝试为git提交消息强制执行特定的消息格式。正则表达式应该强制消息以大写字符开头,并且第一个单词是命令。

我当前正在使用此正则表达式:^[A-Z](?!.*ed).*$

有效:

  • 添加新文件
  • 更新角色模型

无效:

  • 添加了新文件
  • 添加新文件
  • 添加了新文件
  • 更新的角色模型
  • 更新角色模型

尽管所有的正则表达式工具似乎都接受这个正则表达式,但bash不接受。ed排除部分似乎是问题所在:(?!.*ed)

bash-regex不支持负前瞻吗?

这是我的bash脚本:

msg="Add new file"
if [[ $msg =~ ^[A-Z](?!.*ed).*$ ]]; then
echo "Correct"
else
echo "Wrong"
fi

谢谢!

BASH regex不支持前瞻断言。

然而,这里没有必要使用任何前瞻性。您可以使用BASH glob匹配来完成此操作:

[[ $msg = [A-Z]* && $msg != *ed* ]]

使用grep -P,它使用Perl正则表达式:

for msg in 'Add new file' 'add new file' 'Added new file' ; do
if [[ $( grep -Pc '^[A-Z](?!.*ed).*$' <<< ${msg} ) != 0 ]]; then
echo "Correct: ${msg}"
else
echo "Wrong: ${msg}"
fi
done

输出:

Correct: Add new file
Wrong: add new file
Wrong: Added new file

这里,grep使用以下选项:
-P:使用Perl正则表达式
-c:打印匹配行数。

另请参阅:
grep手动

最新更新