Esquisitice do Regex de basquete ao usar o operador = ~


2

Considere este código:

s1="1,2,3,4"; \
s2="1,2,3"; \
sP='^(([1-9][0-9]{0,},){1,2}){1,2}$'; \
[[ "${s1}," =~  $sP ]] && echo "\$s1 matches"; \
[[ "${s2}," =~  $sP ]] && echo "\$s2 matches, but why?"

Estou perplexo com o motivo pelo qual a segunda corda é correspondida. Meu regex é defeituoso? É suposto combinar 2 ou 4 "elementos".


Como não consigo editar minha pergunta, aqui vai: eu gostaria de combinar 1, 2 ou 4 instâncias da sequência de dígitos (esqueci a 1, que requer o quantificador interno "combinado" de '{1,2}')
Você pode usar o seguinte comando

O ponto principal da minha pergunta deve ser: "Por que não funciona dessa maneira"? Do que eu senti falta?
user584029

Respostas:


0

Para corresponder a 1, 2 ou 4 elementos, o ERE deve ser modificado da seguinte maneira:

s1="1,2,3,4" ;\
s2="1,2,3" ;\
s3="1" ;\
sP='^[1-9][0-9]{0,},$|^(([1-9][0-9]{0,},){2}){1,2}$' ;\
[[ "${s1}," =~  $sP ]] && printf "\$s1, matches\n" ;\
[[ "${s2}," =~  $sP ]] || printf "\$s2, does not match\n" ;\
[[ "${s3}," =~  $sP ]] && printf "\$s3 matches\n"

Seu ERE original pode ser descrito iterativamente:

[1-9][0-9]{0,}, corresponde a 1 ou 2 ou 3 ou 432 etc.

([1-9][0-9]{0,},){1,2} corresponde a uma ou duas sequências consecutivas descritas acima: 1, 3, 1,2, 10, 10,432 etc.

(([1-9][0-9]{0,},){1,2}){1,2} corresponde a 1 ou 2 ocorrências da última sequência 1 ou 1,2 ou 1,2,3 etc.


Jay, é claro; Desculpe, eu misturei isso na minha pergunta, e o exemplo não indica que: eu gostaria de combinar 1, 2 ou 4 instâncias (esqueci a 1, que requer o quantificador interno "combinado" de '{1,2 } '); Vou comentar abaixo pergunta original, bem ...
user584029

@ user584029 A parte superior da resposta foi atualizada com um novo ERE. Corresponde a s1 e "1", mas não a s2.
Jay Jargot

Sim, obrigado pela adição de "... 1, 2 ou 4 sequências ..."; Não esclarei o suficiente - estou procurando mais uma explicação do "por que não funciona" (o original) - para ter certeza de que não entendi mal os EREs.
user584029

[@] Jay Jargot A última linha não me deixa totalmente convencido: sua parte interna (como na próxima à última linha) produz uma sequência do tipo "d ... d" ou uma sequência do tipo "d ... d, d ... d "; permitir que uma dessas seqüências ocorra uma ou duas vezes deve render (1) "d ... d" ou (2) "d ... d, d ... d" ou (3) "d ... d, d ... d, d ... d, d ... d "", pelo qual (2) poderia ser construído de duas maneiras. Novamente, talvez eu não tenha conseguido entender totalmente os EREs ... Aliás: printf é melhor!
user584029

@ user584029 o ERE é criado ou com 2 partes delimitadas |. No lado esquerdo, corresponde apenas a uma única sequência. No lado direito ele corresponda 2 ou 4 etc.
Jay Jargot
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.