shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script-pt] Regex para casar links num documento markdown


From: Arkanon
Subject: Re: [shell-script-pt] Regex para casar links num documento markdown
Date: Thu, 16 Mar 2023 01:15:31 -0300

Não tenho uma referência fixa acerca de PCRE.

Procurando rapidamente agora, um bom resumão para início me parece, mesmo, o artigo da Wikipedia: http://wikipedia.org/wiki/Perl_Compatible_Regular_Expressions

Percebi pela primeira vez as características especiais dela quando estava procurando uma ER para identificar o período de dízimas periódicas: dada a expansão decimal de uma fração com um número adequado de dígitos para conter todo o período repetido um número suficiente de vezes (que depende da parte não periódica, aqui, 3), a ER \.(\d*?)\K(\d+?)(?=(\2){3,}) permite identificar esse período.

Por ex:
   fracao=1/1888
 expansao=240
repeticao=3
export BC_LINE_LENGTH=0
bc <<< "scale=$expansao;$fracao" | grep --color -P "\.(\d*?)\K(\d+?)(?=(\2){$repeticao,})"

.000529661016949152542372881355932203389830508474576271186440677966101694915254237288135593220338983050847457627118644067796610169491525423728813559322033898305084745762711864406779661016949152542372881355932203389830508474576271186440677966
Hoje conheço até um algoritmo matemático para obter o período mas, na época, foi a conclusão de um problema algorítmico que me incomodava desde o secundário e que nunca me arrisquei a enfrentar programando, pois intuitivamente sempre me pareceu muito mais complexo do que sugere a primeira análise. E uma ER MISERÁVEL resolveu o negócio, hehe.

(o_                          __o
//\   arkanon@lsd.org.br   _`\<,
V_/_                      (_)/(_)
---------------------------------


Em qua., 15 de mar. de 2023 às 20:29, Guilherme Gall <gmgall@gmail.com> escreveu:
Eu não conheço muito. Sempre soube que existem, mas nunca parei para
estudar direito. Como sempre me virei com o que sabia, fui postergando
o estudo das PCRE.

Tem algum material interessante para indicar?

Em ter., 14 de mar. de 2023 às 12:23, Arkanon <arkanon@lsd.org.br> escreveu:
>
> Não sei o quão íntimo você é das PCRE, Guilherme, mas as considero uma extensão maravilhosa das ERE.
>
> O simples fato de permitirem levar em consideração uma parte da ER apenas para match mas não para referência efetiva, tanto para frente quanto para trás (lookahead e loobehind) já abre uma gama de aplicações que dificilmente eu consigo ignorar.
>
> O problema em potencial das PCRE é o suporte ainda incompleto (no grep por ex) ou inexistente (no sed por ex) que sempre deve ser levado em consideração quando se cogita utilizá-las.
>
> Pessoalmente, sou tão fã que não me importo nem um pouco em nivelar minhas ER no padrão PCRE, mas estou bem ciente que isso pode limitar a aplicabilidade delas fora das ferramentas que utilizo.
>
> At.te,
>
> (o_                          __o
> //\   arkanon@lsd.org.br   _`\<,
> V_/_                      (_)/(_)
> ---------------------------------
>
>
> Em ter., 14 de mar. de 2023 às 11:16, Guilherme Gall <gmgall@gmail.com> escreveu:
>>
>> Opa, parece que você matou a charada, Arkanon.
>>
>> Obrigado novamente!
>>
>> Eu ia demorar para pegar essa. Isso se pegasse porque, para começar,
>> na minha cabeça -E e -P no grep eram equivalentes.
>>
>> Abraço,
>>
>> Guilherme
>>
>> Em ter., 14 de mar. de 2023 às 03:12, Arkanon <arkanon@lsd.org.br> escreveu:
>> >
>> > Achei!
>> >
>> > Veja a sutil diferença:
>> >
>> > pcre='\[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)'
>> >  ere='\[[^]]+\]\(([^()]+|[^()]+\([^)]+\).*)\)'
>> >
>> > $ grep --color -noP $pcre exemplo.md
>> > $ grep --color -noE $ere  exemplo.md
>> >
>> > 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system)
>> > 3:[Wordpress](https://wordpress.org/)
>> > 4:[LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle))
>> > 6:[Geradores de sites estáticos](https://en.wikipedia.org/wiki/Static_site_generator)
>> > 7:[Jekyll](https://jekyllrb.com/)
>> > 7:[Hugo](https://gohugo.io/)
>> > 9:[contato](/contact)
>> >
>> > Obrigado pelo problema :)
>> >
>> > (o_                          __o
>> > //\   arkanon@lsd.org.br   _`\<,
>> > V_/_                      (_)/(_)
>> > ---------------------------------
>> >
>> >
>> > Em ter., 14 de mar. de 2023 às 02:57, Arkanon <arkanon@lsd.org.br> escreveu:
>> >>
>> >> Por algum motivo obscuro, se você forçar o grep a usar PCRE, a coisa funciona como imagino que você queira:
>> >>
>> >> $ grep --color -noP '\[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)' exemplo.md
>> >> 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system)
>> >> 3:[Wordpress](https://wordpress.org/)
>> >> 4:[LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle))
>> >> 6:[Geradores de sites estáticos](https://en.wikipedia.org/wiki/Static_site_generator)
>> >> 7:[Jekyll](https://jekyllrb.com/)
>> >> 7:[Hugo](https://gohugo.io/)
>> >> 9:[contato](/contact)
>> >>
>> >> Só não estou identificando agora nessa ER nenhuma característica específica de PCRE que justifique não funcionar com ERE...
>> >>
>> >> (o_                          __o
>> >> //\   arkanon@lsd.org.br   _`\<,
>> >> V_/_                      (_)/(_)
>> >> ---------------------------------
>> >>
>> >>
>> >> Em seg., 13 de mar. de 2023 às 22:41, Guilherme Gall <gmgall@gmail.com> escreveu:
>> >>>
>> >>> Fala Arkanon, tudo certo?
>> >>>
>> >>> Consegui ver a formatação, sim. Muito obrigado pela resposta. :-D
>> >>>
>> >>> Realmente lá no regex101 parece que fica certinho.
>> >>>
>> >>> Só não funciona colocando ela diretamente no grep como eu conseguia
>> >>> fazer com a 1ª versão. Considerando o mesmo arquivo exemplo.md:
>> >>>
>> >>> --- shell ---
>> >>> $ grep -n -E -o '\[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)' exemplo.md
>> >>> 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system), como
>> >>> o [Wordpress](https://wordpress.org/). Porém, verifique se você pode
>> >>> instalar a pilha
>> >>> [LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle))
>> >>> 5:[Geradores de sites
>> >>> estáticos](https://en.wikipedia.org/wiki/Static_site_generator) (como
>> >>> o [Jekyll](https://jekyllrb.com/) ou o [Hugo](https://gohugo.io/))
>> >>> 7:[contato](/contact)
>> >>> --- fim da saída do shell ---
>> >>>
>> >>> Observe que ela casa do início do 1º link na linha até o final do
>> >>> último link na linha num único grupo.
>> >>>
>> >>> Na linha 3, tem 3 links que casam como um grupo só. Na linha 5 idem.
>> >>>
>> >>> Vou quebrar a cabeça um pouco por aqui com flags do grep e tentando
>> >>> adaptar a tua versão.
>> >>>
>> >>> Abraço,
>> >>>
>> >>> Guilherme
>> >>>
>> >>> Em seg., 13 de mar. de 2023 às 12:47, Arkanon <arkanon@lsd.org.br> escreveu:
>> >>> >
>> >>> >
>> >>> > Experimente essa versão:
>> >>> >
>> >>> > https://regex101.com/r/KMzhNZ/2
>> >>> >
>> >>> > A ER ficou
>> >>> >
>> >>> > \[[^]]+\]\(([^()]+|[^(]+\([^)]+\).*)\)
>> >>> >
>> >>> > Não sei se você verá a formatação com fundo vermelho.
>> >>> > Minha sugestão é considerar 2 casos:
>> >>> >
>> >>> > -----------------------------v  url's sem parênteses
>> >>> > \[[^]]+\]\(   (   [^()]+   |   [^(]+\([^)]+\).*   )   \)
>> >>> > ------------------------------------------------------^ url's com parênteses
>> >>> >
>> >>> > ISSO (não a sugestão anterior :-p) ajuda?
>> >>> >
>> >>> > Ab,
>> >>> >
>> >>> > (o_                          __o
>> >>> > //\   arkanon@lsd.org.br   _`\<,
>> >>> > V_/_                      (_)/(_)
>> >>> > ---------------------------------
>> >>> >
>> >>> >
>> >>> > Em seg., 13 de mar. de 2023 às 11:58, Guilherme Gall <gmgall@gmail.com> escreveu:
>> >>> >>
>> >>> >> Saudações, pessoal. Tudo bem?
>> >>> >>
>> >>> >> Estou quebrando a cabeça com uma regex aqui e talvez alguém veja uma
>> >>> >> solução que ainda não vi.
>> >>> >>
>> >>> >> Estou tentando casar todos os links em um arquivo markdown. Listarei
>> >>> >> um exemplo de arquivo de entrada e minha tentativa abaixo, mas caso
>> >>> >> fique difícil de entender, está no regex101 também:
>> >>> >> https://regex101.com/r/KMzhNZ/1
>> >>> >>
>> >>> >> Exemplo de arquivo:
>> >>> >>
>> >>> >> --- exemplo.md ---
>> >>> >> # Blogs
>> >>> >>
>> >>> >> Uma alternativa é usar um
>> >>> >> [CMS](https://en.wikipedia.org/wiki/Content_management_system), como o
>> >>> >> [Wordpress](https://wordpress.org/). Porém, verifique se você pode
>> >>> >> instalar a pilha
>> >>> >> [LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle)) por aí.
>> >>> >>
>> >>> >> [Geradores de sites
>> >>> >> estáticos](https://en.wikipedia.org/wiki/Static_site_generator) (como
>> >>> >> o [Jekyll](https://jekyllrb.com/) ou o [Hugo](https://gohugo.io/))
>> >>> >> também são alternativas populares.
>> >>> >>
>> >>> >> Se quiser trocar ideia comigo sobre isso, entre em [contato](/contact).
>> >>> >> --- fim de exemplo.md ---
>> >>> >>
>> >>> >> Minha tentativa de casamento foi:
>> >>> >>
>> >>> >> --- shell ---
>> >>> >> $ grep -n -E -o '\[[^]]+\]\([^)]+\)' exemplo.md
>> >>> >> 3:[CMS](https://en.wikipedia.org/wiki/Content_management_system)
>> >>> >> 3:[Wordpress](https://wordpress.org/)
>> >>> >> 3:[LAMP](https://en.wikipedia.org/wiki/LAMP_(software_bundle)
>> >>> >> 5:[Geradores de sites
>> >>> >> estáticos](https://en.wikipedia.org/wiki/Static_site_generator)
>> >>> >> 5:[Jekyll](https://jekyllrb.com/)
>> >>> >> 5:[Hugo](https://gohugo.io/)
>> >>> >> 7:[contato](/contact)
>> >>> >> --- fim da saída do shell ---
>> >>> >>
>> >>> >> Um link no markdown tem o formato [texto do link](url), então minha
>> >>> >> lógica foi casar:
>> >>> >>
>> >>> >> - um "abre colchetes" literal seguido de
>> >>> >> - ao menos um caractere que não seja um "fecha colchetes" seguido de
>> >>> >> - um "fecha colchetes" literal seguido de
>> >>> >> - um "abre parênteses" literal seguido de
>> >>> >> - ao menos um caractere que não seja um "fecha parênteses" seguido de
>> >>> >> - um "fecha parênteses"
>> >>> >>
>> >>> >> Isso **quase** funciona. O link em que não funciona é o para a URL
>> >>> >> https://en.wikipedia.org/wiki/LAMP_(software_bundle) que possui
>> >>> >> parênteses.
>> >>> >>
>> >>> >> Toda tentativa de fazer o link acima casar, só acabou com uma regex
>> >>> >> mais difícil de entender e que casava errado o link para
>> >>> >> https://gohugo.io/, pegando inadvertidamente o "fecha parênteses" do
>> >>> >> texto (além do do link).
>> >>> >>
>> >>> >> Virou uma situação em que quando eu acertava o casamento para o link
>> >>> >> de texto "LAMP", eu quebrava o casamento para o link de texto "Hugo" e
>> >>> >> vice-versa.
>> >>> >>
>> >>> >> Alguma ideia?
>> >>> >>
>> >>> >> Grato desde já,
>> >>> >>
>> >>> >> Guilherme
>> >>> >>
>> >>> >> _______________________________________________
>> >>> >> Lista brasileira de usuários de shell script
>> >>> >> Endereço de e-mail da lista: shell-script-pt@nongnu.org
>> >>> >> Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>> >>> >> Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>> >>> >>
>> >>> >> NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>> >>> >
>> >>> > _______________________________________________
>> >>> > Lista brasileira de usuários de shell script
>> >>> > Endereço de e-mail da lista: shell-script-pt@nongnu.org
>> >>> > Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>> >>> > Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>> >>> >
>> >>> > NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>> >>>
>> >>> _______________________________________________
>> >>> Lista brasileira de usuários de shell script
>> >>> Endereço de e-mail da lista: shell-script-pt@nongnu.org
>> >>> Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>> >>> Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>> >>>
>> >>> NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>> >
>> > _______________________________________________
>> > Lista brasileira de usuários de shell script
>> > Endereço de e-mail da lista: shell-script-pt@nongnu.org
>> > Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>> > Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>> >
>> > NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>>
>> _______________________________________________
>> Lista brasileira de usuários de shell script
>> Endereço de e-mail da lista: shell-script-pt@nongnu.org
>> Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
>> Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>>
>> NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
>
> _______________________________________________
> Lista brasileira de usuários de shell script
> Endereço de e-mail da lista: shell-script-pt@nongnu.org
> Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
> Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
>
> NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.

_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]