2011-09-23 12 views
6

Aparte: Ok, sé que no debería estar separando HTML así con una expresión regular, pero es lo más simple para lo que necesito.¿Está optimizado el final de cadena regex en .NET?

tengo unas pocas expresiones regulares:

Regex BodyEndTagRegex = new Regex("</body>(.*)$", RegexOptions.Compiled | 
    RegexOptions.IgnoreCase | RegexOptions.Multiline); 

Aviso cómo estoy en busca de la final de la cadena con $.

¿Son las expresiones regulares de .NET optimizadas para que no tenga que escanear toda la cadena? Si no, ¿cómo puedo optimizarlo para comenzar al final?

+0

Parece una extraña pregunta - alguna razón para sospechar que _wouldn't_ ser? – Cocowalla

+0

Bueno, voy a hacer esto en una cadena muy larga y solo quiero saber si hay una mejor manera de optimizarlo. –

+0

¿Realmente esto es solo para ser más conciso que las llamadas a 'LastIndexOf' y' Substring'? – AakashM

Respuesta

9

Puede controlar él mismo especificando Right-to-Left Mode opción, pero el motor de expresiones regulares no lo hace optimizar el él mismo automáticamente hasta que lo hace usted mismo mediante la especificación de una opción:

Creo punto clave es:

De forma predeterminada, el motor de expresiones regulares busca de izquierda a derecha.

Puede invertir la dirección de búsqueda utilizando la opción RegexOptions.RightToLeft. La búsqueda comienza automáticamente en la última posición del carácter de la cadena. Para los métodos de coincidencia de patrones que incluyen un parámetro de posición de inicio, como Regex.Match (String, Int32), la posición de inicio es el índice de la posición del carácter más a la derecha en la que debe comenzar la búsqueda.

Importante:

La opción RegexOptions.RightToLeft cambia la dirección de búsqueda única; no interpreta el patrón de expresión regular de derecha a izquierda

+3

Acabo de hacer una prueba rápida usando la expresión regex del OP en una cadena larga, usando 10,000 iteraciones. 1,950ms sin RegexOptions.RightToLeft, solo 64ms con él. – Cocowalla

+0

@cocowalla: muy buena ilustración! – sll

+1

... y usar 'LastIndexOf' combinado con' Substring' es aún más rápido, solo 15ms. Pero a menos que tenga una buena razón, me quedaré con la expresión regular para la legibilidad y el mantenimiento :) – Cocowalla

Cuestiones relacionadas