La mayor coincidencia de "cualquier char"

8

En https://www.emacswiki.org/emacs/MultilineRegexp se encuentra la pista para usar

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

en lugar del estándar

.*\norte

para hacer coincidir cualquier carácter con una nueva línea para evitar el desbordamiento de la pila de textos grandes (37 KB). ¿Es el desbordamiento la preocupación aquí, o es una ejecución coincidente para el primero también más eficaz que el segundo?

Vroomfondel
fuente

Respuestas:

9

En las expresiones regulares de Emacs, .no coincide con todos los caracteres. Es sinónimo de [^\n]. Entonces, la razón para usarlo [\0-\377[:nonascii:]]es cuando quieres hacer coincidir "cualquier carácter, incluso una nueva línea".

Wrt desbordando la pila, .*\ndebe manejarse de manera muy eficiente, es decir, sin retroceder y sin comer la pila. Por el contrario, [\0-\377[:nonascii:]]*\nel motor regexp de Emacs lo maneja de manera bastante ineficiente porque consumirá un poco de la pila por cada personaje emparejado, por lo que en los textos "enormes" tenderá a desbordar la pila.

Tenga en cuenta que el emacswiki sugiere [\0-\377[:nonascii:]]*y no [\0-\377[:nonascii:]]*\n.

Stefan
fuente
Gracias por la aclaración. Sin embargo, para el desbordamiento de la pila, ¿está seguro de que [\ 0- \ 377 [: nonascii:]] * \ n causará un desbordamiento? Esto es lo contrario de lo que dice la wiki. ¿Esto es bcs de \ n al final? ¿De qué serviría un patrón como [\ 0- \ 377 [: nonascii:]] * sin un carácter final sería entonces?
Vroomfondel
Cualquier expresión regular que coincida con "cualquier cosa" consumirá espacio en la pila (con el motor de expresión regular de Emacs, quiero decir), y no veo por qué [\0-\377[:nonascii:]]*lo haría menos entonces \\(.\\|\n\\)*. Así que creo que el emacswiki está mal en este caso.
Stefan
¿Alguna forma (o alguien) de aclarar con autoridad sobre este tema?
Vroomfondel
@Vroomfondel pruébalo y verás. Me imagino que la expresión regular con |podría necesitar más retroceso, pero si realmente depende de cómo se compila.
npostavs
3
Eso es cierto solo si la expresión regular termina con [\0-\377[:nonascii:]]*(lo cual es bastante inusual, ya que podría usarlo en point-maxlugar de buscarlo a través de una expresión regular de este tipo) (para los curiosos: el quid de la cuestión es si el conjunto de caracteres puede coincidir después de que el * es disjunta de la serie de carbón que puede coincidir en el *. Si se trata de disjuntos, entonces el motor de expresiones regulares se saltará la grabación de pasos intermedios, y por lo tanto evitar el consumo de espacio de pila. por lo tanto .*\n, y [^a]*ano consumir la pila, mientras .*ahace).
Stefan