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: Guilherme Gall
Subject: Re: [shell-script-pt] Regex para casar links num documento markdown
Date: Thu, 23 Mar 2023 19:23:52 -0300

Nossa, bem interessante, Arkanon! Realmente me motivou a pesquisar
mais. Demorei a responder porque marquei essa thread inteira como lida
por engano, foi mal.
--//--
Agradeço novamente a ajuda de todos nessa thread.

Atenciosamente,

Guilherme


Em qui., 16 de mar. de 2023 às 01:16, Arkanon <arkanon@lsd.org.br> escreveu:
>
> 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.
>
> _______________________________________________
> 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]