Como você aprende expressões regulares? [fechadas]

80

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.

dumbBoy
fonte
2
Mais ou menos no tópico - regular-expressions.info . Use esta e a sugestão de @ Jalayn abaixo. Aprender fazendo!
Freiheit
6
gskinner.com/RegExr é a melhor ferramenta para o desenvolvimento de expressões regulares que eu encontrei.
Callum Rogers
Um pouco por vez. Comece com as coisas simples ("aaa", "aa.", "A * b" etc.) e avance até componentes específicos da implementação (por exemplo, PCRE). Em seguida, crie um padrão e tente fazer um regex que se encaixe nele.
tylerl
Aprendi por tentativa e erro com o ótimo programa RegexBuddy. regexbuddy.com (eu recebo nenhum crédito para anunciar isso, este programa realmente tornou fácil de aprender)
Yam Marcovic
O rubular.com é uma boa ferramenta para o desenvolvimento de regexs.
Gazler,

Respostas:

68

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:

  1. 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)

  2. 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 é?

littleadv
fonte
Comentadores: se você quiser discutir os pontos mais delicados desta questão, use o bate-papo . Caso contrário, considere deixar uma resposta ou votar nas respostas que achar mais corretas.
Obrigado pela edição. Isso torna essa resposta muito mais próxima da verdade. Embora eu ainda não pense que você realmente precise conhecer a Teoria dos Autômatos (eu não sei disso, mas ainda posso escrever expressões regulares complexas), concordo que algum conhecimento da teoria possa ajudar. Especialmente saber como o retorno funciona e é controlado por quantificadores gananciosos / não agradáveis ​​/ possessivos pode realmente ajudar a sua compreensão.
NikiC 23/09
Apenas meus 2 centavos: em uma série recente de vídeos sobre a biblioteca regex C ++ STL no canal 9 do MSDN, o apresentador, que também é mantenedor do STL, disse que o implementa como um autômato. Portanto, conhecer essa teoria deve realmente dar ao OP algumas idéias sobre como o regex funciona.
precisa saber é o seguinte
5
Não concordo com a declaração de abertura. Quando aprendi expressões regulares, nada sabia sobre a teoria dos autômatos. Três décadas depois eu ainda não. O que eu sabia era como ler uma página de manual, interpretá-la literalmente e como fazer experiências rapidamente.
Bryan Oakley
1
@ Bryan bem ... Sua experiência prova o ponto. Talvez você saiba como usá- lo, mas realmente não entende como funciona. Se você sabe, sabe alguma coisa sobre a teoria dos autômatos, mesmo que não saiba o nome. Mas você não consegue entender completamente as expressões regulares sem conhecer a teoria dos autômatos, e nenhuma quantidade de páginas de manual de leitura pode ajudá-lo (a menos que você esteja lendo páginas de manual explicando a teoria de autômatos, é claro).
Littleadv
36

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.

Jalayn
fonte
15
Analisar HTML com expressões regulares geralmente é uma má ideia.
Maxpm 22/09/11
10
Claro que é uma má ideia. O uso de analisadores DOM / Sax ou outros leitores XML dedicados é o que deve ser usado "geralmente". Mas o tópico aqui é sobre o aprendizado de expressões regulares, e eu compartilhei como aprendi sobre expressões regulares da maneira que achei que era "divertida".
Jalayn 22/09/11
3
Usar analisadores XML para páginas da Web HTML é uma ideia ainda pior do que raspar-los com expressões regulares.
skolima 23/09/11
8
Ah, bem, eu queria ser mais preciso sobre o que pensava sobre isso, mas era preguiçoso e apenas reagi ao comentário ... acho que todos podemos concordar que 1. usar expressões regulares para analisar todo o documento é uma má ideia 2. Usar analisadores XML para analisar HTML é uma má idéia 3. Usar analisadores XML para analisar XHTML está certo 4. Usar expressões regulares para recuperar one-liners ou algumas informações muito específicas do HTML estão corretas. Ou eu posso apenas resumir: a ferramenta certa para o trabalho certo ...
Jalayn
23

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.

Arkh
fonte
2
Essa deve ser a resposta definitiva.
slim
1
+100.000 Um dos melhores livros técnicos de todos os tempos, e convenientemente sobre o tópico da pergunta.
Afixe
Adorei este livro. O ponto principal é que isso me ajudou a entender todas as diferentes funcionalidades disponíveis no Regex. Você não será capaz de memorizar toda a sintaxe da leitura de um livro, mas o livro mostrará todas as coisas que existem para que você saiba quais as ferramentas necessárias para resolver um problema quando ele aparecer.
Kibbee
Absolutamente +1 para esta resposta. Afastei-me no regex até finalmente me sentar e ler este volume essencial, linha por linha. Agora Friedl me deu uma base suficiente para que eu pudesse raciocinar através de todas as muitas variações fora do padrão que nos atormentam hoje! Eu recomendo esta referência ao OP e a todos os outros. +1 em @slim pelo seu comentário também!
John Tobler 26/09
19

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.

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.

Eric Lippert
fonte
+1 porque você aborda várias coisas que é bom saber ao usar expressões regulares; No entanto, discordo do seu julgamento de que não é necessário conhecer o interior. Para a perfuração, você está totalmente certo; em computadores, descobri que, mais cedo do que penso, chego ao ponto em que preciso entender o que há para dominar sua aplicação - seja C ++ (compiladores), servidores Web (HTTP) ou expressões regulares (teoria de autômatos) . Não ao ponto de me tornar um especialista, mas uma boa compreensão dos princípios subjacentes é geralmente a maneira mais rápida de aprender.
Felix Dombek 22/09
3
@ Felix: Acho que realmente concordamos. Eu disse que, para aplicativos iniciantes , geralmente não há necessidade de entender como uma ferramenta funciona para usá-la. Essas palavras de doninha foram deliberadas. Para o viajante ou o uso magistral de uma ferramenta, é muito útil entender pelo menos algo sobre seus componentes internos, para que você possa prever com precisão onde a ferramenta terá um desempenho ruim, digamos.
Eric Lippert 22/09
Hmm, eu teria que discordar um pouco. Alguns dos programas de negócios mais úteis que criei usaram a teoria que aprendi no lexx e no yacc para resolver problemas com eficiência. Você está certo, porém, não é necessário um entendimento completo em nível de doutorado . Vou ter que ler as postagens do blog, elas parecem mais interessantes.
Spencer Rathbun 23/09
Você diz que expressões regulares não são regulares - mas eu pensei que o mundo regular no nome estava se referindo às expressões que corresponde - por exemplo, a expressão regular "[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.
configurador
1
@ configurador: Uma linguagem "regular" é por definição uma linguagem que pode ser reconhecida por um autômato finito. Toda linguagem regular pode ser caracterizada por uma "expressão regular" consistindo apenas de uniões, alternativas, catenações e a Estrela Kleene. Mas a maioria dos mecanismos de "expressão regular" hoje em dia reconhece linguagens mais complexas do que linguagens regulares; por exemplo, o idioma de "sentenças com parênteses correspondidos corretamente" não é regular, mas você pode combiná-lo com uma "expressão regular" em alguns mecanismos de expressão regular.
Eric Lippert
6

Como diabos eu os enfrento?

Como qualquer coisa nova:

10 Study
20 Practice
30 goto 10

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:

if ( 'foo' == 'bar' ) doSomething();

Esse exemplo é péssimo porque nunca fará nada

if ( foo == 'bar' ) doSomething();

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:

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

Maravilhoso, agora os usuários podem barentrar 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 digitaram BRA100 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á correspondendo something == 'color'? Agora você terá que combinar something == '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:

/colou?r/.test( something )

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:

string.match( regex )
regex.exec( string )
regex.test( string )

Começando com algo simples como:

javascript:'color'.match(/colou?r/);

é 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.

zzzzBov
fonte
+1 por recomendar mexer com JavaScript no navegador.
John Tobler 26/09
5

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.

Michael Easter
fonte
O "processador regex" mencionado na verdade não implementa disjunções e, com a abordagem fornecida, é muito difícil adicioná-las. Gosto do livro, mas fiquei decepcionado com isso.
Felix Dombek 22/09
4

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.

John Fisher
fonte
1
+1, "Regex Hero" também é legal: regexhero.net/tester
Angelo
Regexbuddy é uma das minhas ferramentas favoritas. Ver a visualização em árvore é incrivelmente útil, pois é possível testar instantaneamente enquanto você gera seu regex. Eu aprendi muito mais regex sem tentar aprender apenas usando.
Chao
1
Sempre achei o RegexBuddy interessante, mas não gosto de comprá-lo. Para testes básicos de regex, existem muitos outros utilitários. Para ver uma descrição textual da regex, embora haja menos ferramentas. A versão paga do Regex Hero também. Uma coisa bastante única para o RegexBuddy é o Regex Debugger, que mostra cada aceitação ou rejeição de um personagem e cada retorno em detalhes excrutadores, o que pode realmente ajudar na depuração de um regex grande e muito complicado. Eu não notei nenhuma outra ferramenta que faça isso.
Kevin Cathcart 23/09
3

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.

Neil
fonte
3

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.

  1. 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í.

  2. 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.

Jay Imerman
fonte
1
Obrigado pela dica sobre o Expresso. Eu tentei e é incrível!
Jim In Texas
3

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:

  1. : defina incsearch ... enquanto você digita um padrão de pesquisa na linha de comando, o editor rapidamente salta para o primeiro pedaço de texto que corresponde e destaca exatamente o que está correspondendo. Se você digitar algo que não corresponda mais a nada, o Vim retornará o cursor para onde você estava quando começou.
  2. : defina hlsearch ... isso informa ao Vim para mostrar um plano de fundo destacado em todo o texto que corresponde à pesquisa atual do ER.

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.

Firstrock
fonte
O RegExCoach agora é shareware. Achei muito útil no desenvolvimento de ERs complexas no estilo Perl.
Firstrock 22/09/11
2

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.

Ingo
fonte
2

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.

Steven
fonte
2

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/

Thiago Negri
fonte
1

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-regexpcomando 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.

jwernerny
fonte
1

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.

Spencer Rathbun
fonte
1

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:

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

para coincidir com o minuto:

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

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.

frogstarr78
fonte
1

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

  • grandes habilidades e conhecimentos sobre expressões regulares
  • boas habilidades com sed
  • ajudando muitos projetos de código aberto
  • recebendo muitas atividades de contribuição mostradas no meu perfil do github
  • outra boa ferramenta 'canivete suíço' para o cinto de ferramentas virtual

e foi ajudado nessa abordagem pela necessidade de

  • alcançar objetivos reais sem trapacear
  • use as habilidades (regex) como parte de um objetivo maior e com maior motivação.
  • ser capaz de mostrar provas das habilidades que aprendi alterando o código de outras pessoas e depois revisando as alterações.

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:

Michael Durrant
fonte
0

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

Philip Schweiger
fonte