Tenho uma pequena regexp que deve verificar se um assunto de commits adere ao formato de mensagem de commit do ReactJS. Como a expressão funciona com minhas strings de teste, o código me deixou perplexo.
Este pequeno exemplo deve reproduzir o comportamento:
#!/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"
Isso leva ao seguinte resultado:
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
Você precisará usar
.
instead of[^\n]
no seu regex de shell para corresponder a qualquer caractere.[^\n]
está sendo avaliado como[^n]
ie qualquer caractere diferente den
e suas strings de exemplo número 2, 3 e 4 têm a letran
em algum lugar depois da correspondência:
.Isso deve funcionar para você:
Saída:
Bash regexp não sabe
\n
ser um caractere de nova linha. O[^\n]
é apenas um[^n]
, então as linhas que seu script marca como inválidas - têm "n" nelas ("checking", "new").A nova linha que o bash regexp reconhece é, na verdade
$
, - fim da linha.Outro ponto - suas strings de teste não têm
\n
caracteres, então não há necessidade real de verificar sua ausência - portanto, um simples<complex_pattern>: .+
é o suficiente, o que significaria que o padrão complexo termina com dois pontos, espaço e você tem algo depois disso. Não há necessidade real de terminar o padrão com,$
pois ele já irá até o fim de uma string.Dito isso... se você apenas pressionar Enter dentro do padrão, você obterá uma string como:
Mas bush (ou pelo menos algumas versões dele) verá isso como uma única string com a
\n
e fará um verdadeiro "no \n dentro da string".É possível - sim. É melhor que simples
.+
- definitivamente não. Mas como um recurso engraçado e uma possível maneira de confundir as pessoas - sim.