Correspondência com melhor desempenho de "qualquer caractere"

8

Em https://www.emacswiki.org/emacs/MultilineRegexp, encontra-se a dica para usar

[\ 0- \ 377 [: nonascii:]] * \ n

em vez do padrão

. * \ n

para corresponder qualquer caractere até uma nova linha para evitar o estouro de pilha para textos grandes (37 KB). O estouro é a preocupação aqui, ou uma execução correspondente para o primeiro também é mais eficiente que o último?

Vroomfondel
fonte

Respostas:

9

Nos regexps do Emacs, .não corresponde a todos os caracteres. É um sinônimo de [^\n]. Portanto, a razão para usar [\0-\377[:nonascii:]]é quando você deseja corresponder "qualquer caractere, mesmo uma nova linha".

O transbordamento excessivo da pilha .*\ndeve ser tratado com muita eficiência, ou seja, sem voltar atrás e sem devorar a pilha. Pelo contrário, [\0-\377[:nonascii:]]*\né tratado de maneira ineficiente pelo mecanismo regexp do Emacs, porque consumirá um pouco da pilha para cada caractere correspondente, portanto, em textos "grandes", ela tenderá a sobrecarregar a pilha.

Note que o emacswiki sugere [\0-\377[:nonascii:]]*e não [\0-\377[:nonascii:]]*\n.

Stefan
fonte
Obrigado pelo esclarecimento. No entanto, para o estouro de pilha, você tem certeza de que [\ 0- \ 377 [: nonascii:]] * \ n causará um estouro? Isso é o contrário do que o wiki afirma. Esses bcs do \ n estão no final? De que utilidade seria um padrão como [\ 0- \ 377 [: nonascii:]] * sem um caractere final?
precisa saber é o seguinte
Qualquer regexp que corresponda a "qualquer coisa" consome espaço na pilha (com o mecanismo de regexp do Emacs, quero dizer), e não vejo por [\0-\377[:nonascii:]]*que faria isso menos do que isso \\(.\\|\n\\)*. Então eu acho que o emacswiki está errado neste.
Stefan
Alguma maneira (ou alguém) de esclarecer com autoridade sobre esse assunto?
precisa saber é o seguinte
@Vroomfondel testá-lo e ver. Eu posso imaginar que o regexp with |pode precisar de mais retorno, mas se ele realmente depende de como é compilado.
precisa saber é o seguinte
3
Isso é verdade apenas se o regexp terminar com [\0-\377[:nonascii:]]*(o que é bastante incomum, pois você pode usá-lo em point-maxvez de procurá-lo por meio de um regexp) (para os curiosos: o cerne da questão é se o conjunto de caracteres que pode corresponder após a * é disjunto do conjunto de caractere que pode corresponder dentro do *. Se for disjuntos, então o motor regexp irá ignorar a gravação de passos intermediários, e, portanto, evitar comer-se espaço de pilha. então, .*\ne [^a]*anão consumir a pilha, enquanto .*afaz).
Stefan