我有一个小正则表达式,可以验证提交主题是否符合 ReactJS 提交消息格式。由于该表达式适用于我的测试字符串,因此代码让我感到困惑。
这个小例子应该重现这种行为:
#!/bin/bash
function test_subject {
local subject="$1"
local pattern="^(feat|fix|docs|style|refactor|test|chore)\([a-zA-Z0-9._-]+\): [^\n]+$"
if ! [[ $subject =~ $pattern ]]; then
echo "Invalid subject: $subject"
else
echo " Valid subject: $subject"
fi
}
test_subject "chore(gh-actions): add script for commit check"
test_subject "chore(gh-actions): add script for commit checking"
test_subject "feat(ABC-123): add new feature"
test_subject "fix(ABC123): add new feature"
test_subject "fix(ABC123): fix previously added feature"
test_subject "fix(scope): fix bug"
这将导致以下输出:
Valid subject: chore(gh-actions): add script for commit check
Invalid subject: chore(gh-actions): add script for commit checking
Invalid subject: feat(ABC-123): add new feature
Invalid subject: fix(ABC123): add new feature
Valid subject: fix(ABC123): fix previously added feature
Valid subject: fix(scope): fix bug
您将需要在 shell 正则表达式中使用
.
而不是来匹配任何字符。[^\n]
[^\n]
被评估为[^n]
除 之外的任何字符n
,并且您的示例字符串编号 2、3 和 4n
在匹配后的某处 有字母:
。这应该对你有用:
输出:
Bash 正则表达式不知道
\n
什么是换行符。这[^\n]
只是一个[^n]
,所以您的脚本标记为无效的行中含有“n”(“checking”、“new”)。bash regexp 识别的新行实际上是
$
- 行尾。还有一点 - 您的测试字符串中没有
\n
字符,因此没有必要检查其是否缺失 - 因此简单<complex_pattern>: .+
就足够了,这意味着复杂模式以冒号、空格结尾,之后还有内容。没有必要以 结尾模式,$
因为它已经到达字符串末尾。也就是说...如果你只是在模式中按下 Enter 键,你就会得到如下字符串:
但是 bush (或者至少它的某些版本) 会将其视为带有 a 的单个字符串
\n
,并执行真正的“字符串内没有 \n”。有可能 - 是的。这比简单更好吗
.+
- 绝对不是。但作为一项有趣的功能和可能让人困惑的方式 - 是的。