Depende se você tem uma expressão regular ou uma expressão regular: expressões regulares são más, mas expressões regulares são uma coisa de beleza e nunca se tornarão más para você.
Por regexp, quero dizer uma expressão regular moderna: ou seja, uma expressão regular com recursos modernos adicionais, como referências anteriores - por exemplo, uma expressão regular compatível com Perl. Isso é mais poderoso do que uma expressão regular clássica de um livro formal de teoria de linguagens / autômatos, pois as expressões regulares clássicas não permitem referências anteriores, lookahead, lookbehind e assim por diante.
Para uma expressão regular clássica, se você tiver uma boa implementação para o correspondente, nenhuma expressão regular será muito ruim. Em particular, um algoritmo padrão para correspondência é converter a expressão regular em um NFA e, em seguida, executar o NFA em uma sequência de entrada. Para esse algoritmo, o pior caso de execução para testar uma cadeia de caracteres é O ( n ) , quando a expressão regular é corrigida. Isso significa que o tempo de execução não pode explodir muito rapidamente. Não existe uma sequência que cause um aumento exponencial no tempo de execução. Portanto, se você estiver usando um combinador que usa esse algoritmo, nenhuma expressão regular clássica será má.nO ( n )
Isso depende da implementação do correspondente de expressão regular. Se você tem uma implementação ingênua ou ruim do correspondente, a correspondência pode levar um tempo exponencial; certamente existem algoritmos com essa propriedade. Mas a melhor resposta para isso é provavelmente não mudar a expressão regular; provavelmente é melhor escolher um parceiro melhor, se você estiver preocupado com ataques de negação de serviço.
Em comparação, alguns regexps modernos são inevitavelmente maus. Se você possui uma regexp moderna, a correspondência pode exigir um tempo exponencial. Em particular, regexps com referências anteriores podem reconhecer linguagens NP-hard. Conseqüentemente, sob suposições plausíveis, existe uma classe de más expressões no qual os testes para uma partida levam um tempo exponencial. Assim, alguns regexps modernos são inevitavelmente maus: não há maneira viável de encontrar um regexp equivalente que não cause uma explosão exponencial no tempo de execução.
(Esse equivalente pode existir e pode até ser encontrado na teoria, mas sob suposições plausíveis, encontrar o regexp equivalente levará um tempo exponencial, o que não é possível na prática. Se você tivesse um procedimento sistemático para encontrar o regexp equivalente em tempo polinomial , então você pode resolver o problema de NP-difícil em tempo polinomial, provando que P = NP. Não faz muito bem que exista um regexp equivalente se não houver como encontrá-lo durante a sua vida.)
Antecedentes e fontes: