Digamos que você tenha um documento com um ensaio escrito. Você deseja analisar este ensaio para selecionar apenas determinadas palavras. Legal.
O uso de uma expressão regular é mais rápido do que analisar o arquivo linha por linha e palavra por palavra, procurando uma correspondência? se sim, como isso funciona? Como você pode ir mais rápido do que olhar para cada palavra?
regular-expressions
lazer
fonte
fonte
Respostas:
Dê uma olhada na teoria dos autômatos
Em resumo, cada expressão regular possui um autômato finito equivalente e pode ser compilado e otimizado para um autômato finito. Os algoritmos envolvidos podem ser encontrados em muitos livros do compilador. Esses algoritmos são usados por programas unix como awk e grep.
No entanto, a maioria das linguagens de programação modernas (Perl, Python, Ruby, Java (e linguagens baseadas em JVM), C #) não usam essa abordagem. Eles usam uma abordagem de retorno recursivo, que compila uma expressão regular em uma árvore ou uma sequência de construções que representam vários sub-blocos da expressão regular. A maioria das sintaxes modernas de "expressão regular" oferece referências externas que estão fora do grupo de linguagens regulares (elas não têm representação em autômatos finitos), que são trivialmente implementáveis na abordagem de retorno recursivo.
A otimização geralmente produz uma máquina de estado mais eficiente. Por exemplo: considere aaaab | aaaac | aaaad, um programador normal pode obter a implementação de pesquisa simples, mas menos eficiente (comparando três strings separadamente) em dez minutos; mas percebendo que é equivalente a aaaa [bcd], uma pesquisa melhor pode ser feita pesquisando os quatro primeiros 'a' e testando o quinto caractere contra [b, c, d]. O processo de otimização foi um dos meus trabalhos domésticos de compilador há muitos anos, portanto, presumo que ele também esteja nos mais modernos mecanismos de expressão regular.
Por outro lado, as máquinas de estado têm alguma vantagem quando aceitam cadeias porque usam mais espaço em comparação com uma "implementação trivial". Considere um programa para remover as aspas das seqüências de caracteres SQL, ou seja: 1) inicia e termina com aspas simples; 2) aspas simples são escapadas por duas aspas simples consecutivas. Portanto: input ['a' ''] deve produzir saída [a ']. Com uma máquina de estados, as aspas simples consecutivas são tratadas por dois estados. Esses dois estados servem ao propósito de lembrar o histórico de entrada, de modo que cada caractere de entrada seja processado exatamente apenas uma vez, conforme ilustrado a seguir:
Portanto, na minha opinião, a expressão regular pode ser mais lenta em alguns casos triviais, mas geralmente mais rápida do que um algoritmo de pesquisa criado manualmente, considerando o fato de que a otimização não pode ser feita com segurança por humanos.
(Mesmo em casos triviais, como pesquisar uma cadeia, um mecanismo inteligente pode reconhecer o caminho único no mapa de estados e reduzir essa parte a uma comparação simples de cadeias e evitar o gerenciamento de estados.)
Um mecanismo específico de uma estrutura / biblioteca pode ser lento porque o mecanismo faz várias outras coisas que um programador geralmente não precisa. Exemplo: a classe Regex no .NET cria vários objetos, incluindo Correspondência, Grupos e Capturas.
fonte
aaaab|aaaac|aaaad
vs.aaaa[bcd]
. Vale a pena declarar explicitamente que os dois são matematicamente equivalentes e produzem o mesmo DFA, dando assim aos programadores mais liberdade para representar uma expressão regular de uma maneira que faça sentido (não que isso seja uma prática comum, mas ... você sabe). ..Expressões regulares parecem rápidas porque você tem computadores rápidos.
Nos anos 80, quando o 1 MIPS era um computador veloz, as expressões regulares eram uma área bastante grande de preocupação, preocupação e pesquisa, porque eram lentas, feias e intensivas em computação. O desenvolvimento inteligente de algoritmos se seguiu e ajudou - mas, para todos os fins práticos, hoje em dia, você está vendo o milagre de máquinas rápidas encobrindo as fendas.
fonte
Por que você acha que eles são mais rápidos do que pesquisar no documento?
Existem alguns truques que você pode fazer, por exemplo. se você estiver procurando por uma palavra de 10 letras que comece com A e termine com B, se você encontrar um A e o personagem 9 nas posições seguintes não for B, poderá pular alguns. veja o algoritmo de Knuth-Morris-Pratt
fonte
O que torna uma expressão regular rápida?
Na verdade, eles não são. Nem tanto. Só que eles não são lentos o suficiente para a maioria de nós perceber. Nos velhos tempos lentos, era muito mais perceptível.
Eles também não são a ferramenta certa para todos os trabalhos - o martelo .
fonte
Os RegEx são comparativamente mais rápidos em codificar que você pode escrever, porque a maioria das bibliotecas é o resultado de muitos desenvolvedores gastando muitos anos otimizando-os para obter todo o desempenho possível. É difícil para um único indivíduo duplicar isso em seu próprio código de pesquisa.
fonte
Sua premissa básica está errada.
As expressões regulares nem sempre são mais rápidas que uma simples pesquisa. Tudo depende do contexto. Depende da complexidade da expressão, do comprimento do documento que está sendo pesquisado e de vários fatores.
O que acontece é que a expressão regular será compilada em um analisador simples (que leva tempo). Assim, se o documento for pequeno, esse tempo extra superará qualquer vantagem. Além disso, se a expressão for simples, a expressão regular não fornecerá nenhuma vantagem.
Se a expressão for complexa e o documento for grande o suficiente, você poderá obter alguns benefícios. Se isso é significativo o suficiente para considerar as expressões regulares mais rápidas, dependerá muito do esforço que você deseja colocar na pesquisa (também as expressões regulares podem ter algumas otimizações que uma biblioteca poderia fornecer e que você não pensaria em si mesmo).
O que estou tentando dizer é que não há uma resposta generalizada e generalizada. Se você tivesse uma expressão específica (e um tamanho de documento conhecido), seria possível obter uma resposta sim / não para determinar se a expressão será mais rápida que uma simples pesquisa (e por que).
A verdadeira vantagem das expressões regulares é que, depois de entender como escrevê-las, a capacidade de expressar uma pesquisa complexa de maneira concisa. Por ser uma forma generalizada, você pode criar ferramentas que permitam pesquisas de uma maneira útil no caso geral; geralmente é pelo menos tão rápido quanto uma pesquisa simples (em documentos de tamanho mínimo; em documentos menores que isso não importaria, pois, mesmo que seja mais lento, ainda é rápido o suficiente).
fonte
É plausível que em algumas linguagens de alto nível (talvez javascript), o uso de uma biblioteca regex implementada em uma linguagem de baixo nível (talvez C) seja mais rápido do que escrever a lógica do analisador na linguagem de alto nível.
Plausível - não faço ideia se esse é realmente o caso.
fonte