我正在尝试为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
手动