Bash: correspondência exata de uma string com regex

6

Eu tenho que fazer uma correspondência exata em uma string com um regex. Eu tenho que perceber esse padrão: O toCheck deve começar com 2 ocorrências de $ str1, com no máximo 1 ocorrência de $ str2. Se toCheck corresponder ao padrão, eu tenho que escrever $ toCheck: success within output, $ toCheck: failed caso contrário.

Eu escrevi este regex:

regex="$1($1)+$2"

Usando o site regexr.com, eu inseri por exemplo:

regex="lo(lo)ba"
toCheck="loloba"

É um sucesso.

No regerx.com, este jogo até o último ba:

toCheck="lolobaba"

mas, no meu código bash, é um sucesso.

Este é o código completo:

toCheck="lolobaba"
regex="lo(lo)+ba"

if [[ $toCheck =~ $regex ]]; then

    echo "$toCheck:success" > output
else
    echo "$toCheck:failed" > output
fi

Então, a pergunta é: como ter uma correspondência exata entre a string e o regex?

    
por Federico Ponzi 26.09.2014 / 12:54

2 respostas

7

Você obtém um sucesso porque a regex corresponde a uma parte dela.

Se você quiser uma correspondência exata , será necessário ancorar o padrão no início e no final da linha: regex="^lo(lo)+ba$"

  • o ^ significa o início da string: nada pode ser antes do padrão
  • o $ representa o final da string: nada pode ser depois

Em seu código original, como o padrão não está ancorado, a correspondência de padrões não se importa com o que poderia ser antes de depois, se pelo menos uma parte da sequência valida o padrão.

    
por 26.09.2014 / 13:35
0

Quais são os parênteses para? deve começar com 2x $ str1 e terminar com um máximo de 1x $ str2

Então é

    if [[ $toCheck =~ ^$str1$str1($str2|)$ ]] ; then
        echo "$toCheck:success" > output
    else
        echo "$toCheck:failed" > output
    fi
    
por 15.04.2015 / 18:22