git提交消息的Bash lookahead regex不起作用“^[A-Z](?!*ed)。*$”
我试图为git提交消息强制执行某种消息格式。 正则表达式应该强制消息以大写字符开头,并且第一个单词是命令 我目前正在使用这个正则表达式:^[A-Z]\*埃德\*$ 有效期: 添加新文件 更新角色模型 无效: 添加了新文件 添加新文件 添加了新文件 更新的字符模型 更新角色模型 尽管所有仅限正则表达式的工具似乎都接受此正则表达式,但bash不接受。 ed排除部分似乎是问题所在:* bash正则表达式不支持负前瞻吗 这是我的bash脚本:git提交消息的Bash lookahead regex不起作用“^[A-Z](?!*ed)。*$”,regex,bash,git,Regex,Bash,Git,我试图为git提交消息强制执行某种消息格式。 正则表达式应该强制消息以大写字符开头,并且第一个单词是命令 我目前正在使用这个正则表达式:^[A-Z]\*埃德\*$ 有效期: 添加新文件 更新角色模型 无效: 添加了新文件 添加新文件 添加了新文件 更新的字符模型 更新角色模型 尽管所有仅限正则表达式的工具似乎都接受此正则表达式,但bash不接受。 ed排除部分似乎是问题所在:* bash正则表达式不支持负前瞻吗 这是我的bash脚本: msg="Add new file"
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* ]]
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
在这里,grep使用以下选项:
-P:使用Perl正则表达式。
-c:匹配行的打印计数
另见:
使用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
在这里,grep使用以下选项:
-P:使用Perl正则表达式。
-c:匹配行的打印计数
另见:
Bash中没有lokahead请看这个答案=>Bash中没有lokahead请看这个答案=>结果是我的正则表达式与我的意图不完全一致,因为我想确保只有第一个单词没有使用过去时。但是,使用此方法很容易将其更改为:^[A-Z]\w*ed.*$这也将正确地允许类似NONSES msg内容的内容:“为延迟调试日志添加新文件”。有了这个变化,它就起作用了。谢谢原来我的正则表达式并不完全符合我的意图,因为我想确保只有第一个单词没有使用过去时。但是,使用此方法很容易将其更改为:^[A-Z]\w*ed.*$这也将正确地允许类似NONSES msg内容的内容:“为延迟调试日志添加新文件”。有了这个变化,它就起作用了。谢谢谢谢,这将适用于具体示例。但它也会过滤任何包含字符的内容,我猜这些字符会在文本的任何地方出现。我应该为这个案例举个例子——我的错。它还需要接受诸如“为延迟调试日志记录添加新文件”之类的字符串。您可以匹配任何类似[[$msg=*'为延迟调试日志记录添加新文件'*]]的字符串。谢谢,这对特定示例有效。但它也会过滤任何包含字符的内容,我猜这些字符会在文本的任何地方出现。我应该为这个案例举个例子——我的错。它还需要接受诸如“为延迟调试日志记录添加新文件”之类的字符串。您可以匹配任何类似[[$msg=*“为延迟调试日志记录添加新文件”*]。