Não estou perguntando onde aprender. Encontrei muitos bons recursos on-line, livros, etc.
Mas como diabos eu os enfrento. Onde está o começo, o fim? Quando o processador regexp avança no texto, quando ele se mantém e tenta outra correspondência? etc.
Sinto vontade de tentar descobrir hieróglifos nas pirâmides egípcias.
learning
regular-expressions
dumbBoy
fonte
fonte
Respostas:
Eu acho que o conhecimento da teoria de Autômatos é crítico para a compreensão.
Depois de entender o que é um autômato e como as linguagens regulares são definidas, entender as expressões regulares será muito mais fácil.
Quanto à sintaxe específica e às diferenças entre as várias implementações ... Bem, algumas coisas você apenas precisa lembrar. Também existem ajudas para isso.
Editar
Alguns dos comentários abaixo levantaram pontos importantes:
Não esqueça que expressões regulares (como implementadas na maioria das linguagens de programação) são um superconjunto de expressões regulares na teoria dos autômatos. Embora uma boa base teórica seja um local útil para começar, ela não vai lhe contar tudo. (Obrigado, David Thornley)
Vários comentaristas dizem que é possível aprender as várias sintaxes da expressão regular sem aprender a base teórica. Embora seja verdade que você possa aprender a sintaxe sem entender completamente como funciona, fiquei com a impressão de que o entendimento era o que o OP buscava. A pergunta era sobre a base real: quando o processador avança? Quando isso pára? Como ele decide que é uma partida? Essa é a base, essa é a teoria e é baseada na Teoria dos Autômatos. Claro, você pode dirigir um carro sem saber como o motor funciona. Mas se lhe perguntam "como o gás realmente faz com que ele acelere" - você precisa falar sobre como o motor é construído, não é?
fonte
Praticando.
Aprendi me divertindo com a raspagem da web. Tenho certeza de que não estava sozinha fazendo isso apenas por diversão.
Um exemplo: escreva um código que recupere as últimas pontuações de futebol, tênis (o esporte que você gosta de fato) em seu site de esportes favorito. Faça isso escrevendo algum código para carregar a página, extrair as pontuações com expressões regulares e enviá-las para o console ou para algum arquivo de texto. Certifique-se de que, com a expressão regular escolhida, recupere apenas as pontuações e nada mais. Às vezes isso pode ser bastante desafiador :-)
Segundo exemplo: escreva um código que recupere a imagem do seu webcomic favorito (eu gosto muito do Sinfest, por exemplo) e o armazene em algum lugar no seu disco rígido. Use apenas expressões regulares para recuperar a tag "img" e seu conteúdo. Opcionalmente, também recupere seu título se estiver armazenado em algum lugar.
fonte
Sei que você não está pedindo recursos, mas Mastering Regular Expressions, de Jeffrey EF Friedl, foi como aprendi como eles funcionam e como usá-los. Mesmo depois de usar muitos deles para analisar coisas diferentes, o primeiro capítulo teve coisas novas para mim.
Você quer entender aqueles malditos regexp? Leia este livro.
fonte
Eu começaria esclarecendo seus objetivos e depois descobrindo seu estilo de aprendizagem .
O que mais me impressionou na sua pergunta é que você pergunta "como aprendo expressões regulares?" e, em seguida, siga imediatamente com a pergunta "como o mecanismo de expressão regular funciona internamente?" Você parece sugerir que essas duas coisas têm algo a ver uma com a outra, o que é um ponto revelador. Talvez você seja uma pessoa que aprende como algo funciona desmontando-o ou construindo você mesmo.
Para aplicativos iniciantes, geralmente não há necessidade de entender como uma ferramenta funciona para usá-la efetivamente. Você não precisa saber como funciona um motor de perfuração para fazer furos na madeira; você precisa entender como usar a broca, não como construir uma broca.
Então qual é o seu objetivo? Você pretende aprender a criar um mecanismo de expressão regular? ou você pretende aprender a usar efetivamente expressões regulares para resolver problemas de negócios? Atingir esses diferentes objetivos provavelmente requer diferentes técnicas de aprendizado.
Para responder à sua pergunta específica sobre como o mecanismo de expressões regulares funciona: depende. A abordagem teórica "clássica" para expressões regulares é usar a expressão regular como um modelo para um autômato finito não determinístico, construir o autômato finito determinístico equivalente e, em seguida, executar esse autômato na entrada.
Quase ninguém realmente faz isso por várias razões. Primeiro, o número de estados multiplicado pelo número de possíveis caracteres de entrada produz uma tabela de transição de estados que é enorme mesmo para pequenas expressões regulares. Claro, a maior parte disso pode ser compactada, mas ainda assim, são muitas regras de transição. Segundo, outras abordagens são geralmente mais rápidas. Terceiro, as chamadas expressões "regulares" estão nas modernas bibliotecas regexp, nada disso. Eles não são idiomas comuns ; eles geralmente são reconhecidos por autômatos de empilhamento, não por linguagens de autômatos finitos.
(Comecei a escrever uma longa série sobre como tudo isso funciona, mas fiquei sem fôlego após apenas os doze primeiros artigos . Você pode encontrá-los interessantes se desejar uma breve cartilha sobre o fundo teórico das expressões regulares básicas.)
Mecanismos de expressão regular reais geralmente usam uma estratégia de retorno. O mecanismo de expressão regular que criamos para o mecanismo JScript há mais de uma década agora agora compila a expressão regular em uma linguagem de bytecode que inclui primitivas para reconhecer sequências e retornar aos estados anteriores. Em seguida, construímos um intérprete para essa linguagem de bytecode.
Eu não tentaria entender como um mecanismo de expressão regular funciona antes de ter um entendimento bastante sólido de como usar expressões regulares. Concentre-se nisso antes de começar a pesquisar nas estratégias de otimização vários mecanismos diferentes.
fonte
"[0-9]{3}"
que pode corresponder a qualquer número de três dígitos e o número de três dígitos 480 é um exemplo para uma referência regular expressões correspondentes.Como qualquer coisa nova:
Estude
Acho que os professores mais bem-sucedidos começam a ensinar qualquer matéria, primeiro fornecendo um pouco de conhecimento sobre a matéria. É importante ter um contexto do que você está aprendendo e, mais importante, por que você está aprendendo.
É tudo correspondência de seqüência
Expressões regulares são um meio de combinar padrões no texto. É uma linguagem declarativa incorporada em várias outras linguagens de programação.
Gostaria de enfatizar que é uma linguagem declarativa; expressões regulares são úteis para expressar qual string corresponder, mas não expressam de maneira alguma como o programa deve fazer a correspondência. Por esse motivo, é possível usar expressões regulares muito rapidamente e muito lentamente na mesma linguagem de programação, simplesmente usando um analisador RegEx diferente.
O motivo da criação de expressões regulares é o mesmo para a criação da maioria das linguagens de programação: os programadores se viam executando a mesma tarefa complicada repetidamente e decidiram que desejavam uma maneira mais simples de escrever o código.
Alguns irão (e devem) reclamar da minha frase anterior dizendo algo como:
RegEx não torna um programa mais simples.
é verdade
O RegEx não simplifica um programa, o RegEx simplifica a escrita do programa. Você ainda precisa ser cuidadoso em seus testes para garantir que todos os casos corretos sejam correspondidos corretamente e todos os casos incorretos não. É realmente difícil testar "tudo" e, com padrões complicados, é realmente difícil testar "a maioria". Na pior das hipóteses, você ainda deve estar testando "alguns" casos.
vamos incorporar alguns exemplos. Escolhi obrigatoriamente o mecanismo RegEx do JavaScript porque posso testá-lo ao vivo no navegador facilmente e porque não preciso fazer nenhuma string escapar enquanto estiver usando literais RegEx.
Ao fazer a correspondência normal de cadeias, você testa um valor de cadeia em relação a outro. Eles podem vir de qualquer lugar, mas, no final, são necessárias duas seqüências de caracteres comparadas entre si:
Esse exemplo é péssimo porque nunca fará nada
Muito melhor; agora, não sabemos com antecedência se algo será feito ou não. Agora podemos começar a aceitar a entrada do usuário:
Maravilhoso, agora os usuários podem
bar
entrar e algo acontecerá, até que você receba relatórios de erros de usuários dizendo que"bar"
não está funcionando, ou que "BAR" não está funcionando, ou que digitaramBRA
100 vezes e nada acontece.Ignorando os erros de ortografia e os caracteres extras,,
'bar' != 'BAR'
e os programadores precisam pensar em uma maneira de testar onde os caracteres estão no caso errado.Solução simples, use
toLowerCase
. Isso funciona maravilhosamente, mas e os usuários que usam inglês britânico sobre inglês americano quando você está correspondendosomething == 'color'
? Agora você terá que combinarsomething == 'color' || somthing == 'colour'
.Para encurtar a história, padrões simples se transformam em muitos códigos repetitivos muito rapidamente.
O exemplo de cores pode simplesmente ser combinado com:
uma sólida compreensão do básico das expressões regulares pode reduzir significativamente a quantidade de tempo que você perde reinventando a roda.
Onde estudar
A maioria dos idiomas que implementam expressões regulares possui pelo menos um recurso disponível para a sintaxe específica do uso de expressões regulares nesse idioma. Um para JavaScript pode ser encontrado no MDN
Leia-o.
tudo isso.
depois leia novamente.
Leva tempo para aprender, pense nisso como um investimento: uma hora para aprender o RegEx agora economiza uma hora na próxima vez em que você precisar fazer alguma correspondência de padrões de sequência e depois outra hora na próxima vez.
Prática
Depois de ler tudo sobre o RegEx, você provavelmente não entenderá a maior parte. Isso porque você não está realmente fazendo nada com isso.
Mencionei por que escolhi o JS para este exemplo, exorto você a mexer com ele no seu navegador. É rápido e você pode fazer isso corretamente na sua barra de URL.
O JS tem algumas maneiras diferentes e simples de usar o RegEx:
Começando com algo simples como:
é uma maneira fácil de colocar o pé na porta. Brinque com ele, quebre e veja o que combina e o que não combina.
Quando você ficar preso na prática, continue
30
. Você precisa ler para aprender mais, mas precisa praticar para entender verdadeiramente o que aprendeu.fonte
Brian Kernighan escreve um processador reg-ex simples no livro Beautiful Code . Sei que você não está procurando recursos, mas pode ajudar a ver uma implementação básica , por dentro.
fonte
No desenvolvimento normal, o código de depuração pode fornecer informações muito úteis. Expressões regulares não são diferentes. Portanto, com o risco de parecer um anúncio, adquira o RegexBuddy . Ele tem uma ótima ferramenta para exibir visualmente o que o mecanismo está fazendo ao lidar com sua expressão e a string de entrada.
fonte
Expressões regulares podem se tornar muito complicadas muito rapidamente, então eu recomendo que você comece a aprender usando os tutoriais. Saiba que a forma mais simples de expressão regular é uma sequência que representa o que você está procurando. Infelizmente, para poder definir regras de pesquisa especiais, são necessários certos caracteres e esses caracteres devem ser escapados ou você criaria uma expressão regular inválida ou incorreta.
Meu conselho é começar com um exemplo de algo que você está procurando e fugir dele. Portanto, em outras palavras, se você estava procurando algo entre parênteses, dê um exemplo de uma dessas strings no texto em que está pesquisando:
(this is an example of something you'd want to find)
Comece escapando de caracteres para procurar o caractere literal:
\(this is an example of something you'd want to find\)
Teste, verifique se encontra o seu exemplo corretamente. Em seguida, generalize a expressão para encontrar qualquer texto, não apenas o exemplo que você encontrou. Portanto, ele se tornaria:
\([^)]*\)
(significa qualquer caractere que não seja ")" para qualquer número de ocorrências, incluindo 0).Teste-o novamente e verifique se ele não apenas encontra seu exemplo, mas também outros. Pesquise expressões regulares mais complicadas, porém mais frequentes na Internet e corrija-as com suas expressões regulares existentes para evitar ter que se preocupar com todas as possibilidades.
É sobre isso. E oh, aprenda e ame \ Q ... \ E. Na maioria das linguagens de expressão regular, \ Q indica o início de um padrão literal e \ E marca o fim, caso você precise lidar com a pesquisa de padrões particularmente sofisticados e não saiba como escapar deles. Isso salvou minha vida mais do que algumas vezes.
fonte
Vou dar uma resposta simples para uma pergunta simples. Primeiro, você precisa entender o que são Expressões Regulares (RegEx) - o que fazem, para que são usadas. Então, uma ótima ferramenta para começar.
O que é isso? RegEx é um idioma para expressar a correspondência de padrões. Ou seja, usando-o, você pode criar uma combinação de caracteres que reconheça ou encontre padrões no texto. Como isso é útil? Na programação, você pode solicitar aos computadores que correspondam ao texto de alguma fonte (uma entrada do usuário, uma página da web etc.) e detectar se há ou não padrões específicos de texto nela. Por exemplo, um ponto (.) Representa qualquer caractere - letra ou número. Os números entre chaves representam o número de iterações, então ". {1,30}" indica qualquer caractere, repetido entre 1 e 30 vezes - em outras palavras, você não pode ter uma sequência vazia e não pode exceder 30 personagens. E continua a partir daí.
Como começar a aprender? A melhor ferramenta absoluta que eu já vi é o Expresso , mas é apenas para Windows. Possui uma GUI muito extensa, na qual você clica nos elementos que deseja adicionar à sua expressão e, em seguida, um testador para compará-lo com várias entradas para ver os resultados. Não vi nada de bom no Mac (mas estou executando o Windows no VMWare, por isso não preciso realmente de uma versão para Mac), não gastei muito tempo procurando no Linux.
fonte
Além de uma boa referência, a maneira como você realmente aprende é usar boas ferramentas de aprendizado. Um é usar o editor Vim de código aberto , com duas opções definidas:
O outro é usar uma ferramenta gratuita chamada RegExCoach . Você cola o texto que deseja pesquisar e, em outra janela, desenvolve sua expressão regular. Como o Vim, destaca partidas bem-sucedidas em tempo real.
fonte
Você começa com uma comparação básica de cadeias. Muito fácil, mas também não tão poderoso.
Em seguida, pode ter ocorrido a você que você precisa de comparações insensíveis a maiúsculas e minúsculas, para que "grego" e "grego" sejam iguais. Isso é um pouco mais poderoso.
Um dia, você percebe pequenas diferenças na ortografia não deve impedir que duas palavras sejam comparadas iguais: ou seja, "organizar" e "organizar" devem comparar iguais. Você senta e escreve algum código que faz isso e fica feliz.
Até você abstrair um pouco mais e perceber que às vezes deseja que todas as palavras que terminam em "ize" sejam comparadas com os irmãos na ortografia britânica. Ou repetições de algumas cordas uma certa quantidade de vezes. E, claro, você precisa combinar tudo isso.
E assim por diante. Finalmente, você provavelmente acaba com alguma notação em que nem todo personagem se representa. Nada mais é uma regexp. Pode-se vê-lo como descrição de um conjunto de strings.
E então, é bastante fácil e se resume aos três princípios básicos a seguir:
Você tem regexps básicos: caracteres que representam eles mesmos, classes de caracteres, abreviações úteis e não tão úteis para classes de caracteres como \ d ou \ p {Lu} para letras maiúsculas.
E então, você tem algumas possibilidades para combiná-las: se r1 e r2 são regexps, o mesmo acontece com r1r2 r1 | r2 (r1).
Por último, mas não menos importante, os modificadores de repetição: r? r * r + r {n, m}
É o máximo que você precisa saber. Qualquer outra coisa que você possa procurar quando precisar.
fonte
Duas outras boas respostas dizem para você aprender a teoria por trás das expressões regulares e praticar, que são ótimos conselhos. Eu também recomendo obter uma boa ferramenta de regex visual para ajudá-lo se você estiver falando sério.
RegexBuddy , por exemplo, tem um modo de depuração visual que permite que você pisa através da execução de um regex, e mostra através de destaques e texto explicativo que o motor regex está fazendo a cada passo. Há um vídeo demonstrando essa depuração no site deles.
fonte
Tudo o que podemos oferecer é mais recursos para aprender. Esta questão é em si um recurso.
By the way, eu aprendi expressões regulares muito facilmente a partir deste site: http://www.regular-expressions.info/
fonte
Para mim, ver o que o regexp está correspondendo enquanto estou construindo ajuda muito a tornar minha vida mais fácil e me ajudou a entendê-los melhor.
Para fazer isso, vou abrir um arquivo com o texto de destino no Emacs e depois usar o
isearch-forward-regexp
comando Quando você entra no regexp, o Emacs mostra o que ele está correspondendo (essa é a parte "isearch").Para executar o comando, no Emacs, você pode usar
<ESC>xisearch-forward-regexp
.fonte
Aprendi expressões regulares aprendendo flex e bison, que são usadas para criar analisadores e analisadores lexicais. Você não poderia ter um analisador sem expressões regulares, e o livro lexx e yacc é incrivelmente bom em percorrer a teoria sem se mover muito rápido.
Fundamentalmente, praticamente todos os mecanismos regex atualmente seguem os mesmos princípios. Todas elas são máquinas de estados finitos e, se você realmente entender isso, terá uma vantagem sobre praticamente qualquer código que escrever. É semelhante ao aprendizado da recursão, pois, quando você o obtém, aplica-o aos problemas instintivamente. Eles são fáceis de resolver com a ferramenta certa, mas muito difíceis sem ela.
Outra coisa sobre aprender lexx e yacc, em comparação com expressões regulares, é aprender como elas funcionam internamente. Como o programa olha para o futuro, por que termina uma correspondência, como mantém os dados e muito mais. Entender os ponteiros é uma necessidade absoluta, mas se você adquirir lexx e yacc, e passar por isso desde o início, aprenderá tudo o que pediu e terá uma ferramenta extremamente poderosa para o resto de sua carreira.
Essa pergunta inclui vários recursos para a aprendizagem e um esqueleto flexível que juntei.
fonte
Além disso, primeiro tento garantir que não haja uma maneira mais fácil de resolver o problema / "tokenizar" a string.
Quando você não consegue encontrar um, considero um problema não tentar corresponder o que você deseja fora da cadeia, é uma questão de NÃO corresponder ao que você não quer. Isso ocorre principalmente porque os regex são gananciosos. Mas isso me serviu bem como uma abordagem para conseguir o que quero.
Aqui está um exemplo:
para coincidir com o minuto:
Em vez de tentar encontrar o tempo junto com todo o resto, tente encontrar os limites distintos.
O exemplo é um pouco artificial, mas tudo o que pude apresentar.
fonte
Uma abordagem que usei foi encontrar vários projetos de código aberto que precisavam de atualizações de sintaxe e, em seguida, escrever um script sed cada vez mais complexo, composto de muitas expressões regulares.
O script precisava ser executado em muitos arquivos diferentes em cada projeto de código aberto. Em seguida, execute vários projetos diferentes com estilos diferentes. Comecei com algo muito simples, como
%s/before/after
então achei que correspondia a muitos casos. então eu adicionei mais coisas para evitar isso. Então eu encontrei projetos diferentes usando estilos de sintaxe diferentes que precisavam de mudanças diferentes.No final, acabei com
e foi ajudado nessa abordagem pela necessidade de
Também vou passar adiante que existem vários sites para as várias linguagens - ruby, javascript etc. que permitem que você brinque com expressões e exemplos de texto para gratificação imediata. Esses são:
expressões regulares em vários idiomas em um site
concentre-se nos grupos de jogos:
fonte
Descobri aprender expressões regulares semelhantes a aprender as tabelas de multiplicação - sim, você precisa entender as idéias por trás disso, mas, no final das contas, é necessário fazê-lo frequentemente e repetidamente.
Quando estava aprendendo, estabelecia como meta fazer alguns exercícios regulares de regex por dia. Na prática, isso significava que, pelo menos uma vez por dia, eu tentaria olhar uma string ou texto na tela e surgir com um desafio - "posso obter todos os endereços de e-mail daqui" ou "encontrar todos os ocorrências da palavra 'código' usado como verbo e não como substantivo ", coisas assim.
Fazer isso por algumas semanas realmente valeu a pena - e, é claro, são necessárias revisões e atualizações periódicas. Estou prestes a receber um.
Também achei útil essa ferramenta on-line, pois vou testar o regex em tempo real: http://www.gethifi.com/tools/regex
fonte