RegExp - Grupo de Captura Opcional no Bash?

0

Atualmente trabalhando em algum RegExp para analisar um arquivo de entrada para o conteúdo correto. Estou usando o RegExp abaixo para analisar alguma entrada:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]

A entrada deve corresponder:

cell-80-sandp-sit-a

Ou combine isso:

cell-80-sandp-a

A parte -sit da entrada deve ser um grupo de captura opcional , que, no meu entendimento, significa que o RegExp continuará com êxito se não encontrar esse grupo de captura ou também terminar com êxito encontra.

Para esta instância, eu estaria usando em uma declaração if:

if [[ "$Input" =~ $RegExp ]];
    then
        #stuff
fi

Alguém pode apontar o que está errado com o acima? Eu tenho usado regex101.com para testá-lo.

    
por 64Hz 17.05.2018 / 15:13

2 respostas

4

bash entende expressões regulares estendidas padrão ("ERE"), não PCRE ("expressões regulares compatíveis com Perl").

Seu PCRE:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]

O (?:...) em um PCRE é um grupo que não captura (não é um grupo opcional). Não há equivalente em um ERE e todos os grupos estão capturando.

Para tornar uma expressão opcional, você pode qualificá-la com ? , como eu fiz abaixo. O ? significa que a expressão anterior deve corresponder a uma ou zero vezes.

Como um ERE:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)?-[a-z]

ou, contratando (SIT[a-z]|SIT[1-9]) em SIT[a-z1-9] ,

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]

Você também pode querer adicionar ancoragem a isso:

^cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]$

... caso contrário, ele corresponderia a somethingcell-...-ablahblah

    
por 17.05.2018 / 15:41
1

(?:...) não é um grupo de captura opcional, mas um grupo sem captura, que - até onde eu sei - nem sequer é suportado pelo bash. Isso deve funcionar:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))?-[a-z]

    
por 17.05.2018 / 15:42