Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git提交消息的Bash lookahead regex不起作用“^[A-Z](?!*ed)。*$”_Regex_Bash_Git - Fatal编程技术网

git提交消息的Bash lookahead regex不起作用“^[A-Z](?!*ed)。*$”

git提交消息的Bash lookahead regex不起作用“^[A-Z](?!*ed)。*$”,regex,bash,git,Regex,Bash,Git,我试图为git提交消息强制执行某种消息格式。 正则表达式应该强制消息以大写字符开头,并且第一个单词是命令 我目前正在使用这个正则表达式:^[A-Z]\*埃德\*$ 有效期: 添加新文件 更新角色模型 无效: 添加了新文件 添加新文件 添加了新文件 更新的字符模型 更新角色模型 尽管所有仅限正则表达式的工具似乎都接受此正则表达式,但bash不接受。 ed排除部分似乎是问题所在:* bash正则表达式不支持负前瞻吗 这是我的bash脚本: msg="Add new file"

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

我目前正在使用这个正则表达式:^[A-Z]\*埃德\*$

有效期:

添加新文件 更新角色模型 无效:

添加了新文件 添加新文件 添加了新文件 更新的字符模型 更新角色模型 尽管所有仅限正则表达式的工具似乎都接受此正则表达式,但bash不接受。 ed排除部分似乎是问题所在:*

bash正则表达式不支持负前瞻吗

这是我的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* ]]

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=*“为延迟调试日志记录添加新文件”*]。