2011-05-04 5 views
15

hace algo sabe por qué la salida de este código:Regex.Match, startat y^(inicio de la cadena)

Regex re = new Regex("^bar", RegexOptions.Compiled); 
string fooBarString = @"foo bar"; 

Match match1 = re.Match(fooBarString, 4); 
Console.WriteLine(String.Format("Match 1 sucess: {0}", match1.Success)); 

Match match2 = re.Match(fooBarString.Substring(4)); 
Console.WriteLine(String.Format("Match 2 sucess: {0}", match2.Success)); 

es:

Partido 1 éxito: Falso

Partido 2 éxito: verdadero

?

El comportamiento esperado es, por supuesto, "Verdadero" y "Verdadero" (o bien, realmente no sé para qué se supone que es útil el parámetro "startat").

La idea es que esta coincidencia de expresiones regulares (y hay muchas de ellas) se llama con mucha frecuencia (varios tous y por segundo) y descubrimos que las operaciones de subcadena están matando el rendimiento de la memoria.

Gracias por su ayuda!

Respuesta

12

Según MSDN

Si desea restringir un partido tan que comienza en una posición carácter particular en la cadena y el motor de expresiones regulares no escanear el resto de la cadena de una coincidencia , ancle la expresión regular con una \ G (a la izquierda para un patrón de izquierda a derecha , o en la derecha para un patrón de derecha a izquierda). Este restringe la coincidencia, por lo que debe iniciarse en exactamente al inicio.

La expresión regular se hace juego con la cadena completa, tendrá que usar \ G en lugar de^

http://msdn.microsoft.com/en-us/library/3583dcyh.aspx

0

Suena como que tienes razón - usted está confundido sobre el significado de ^ . ^ significa el comienzo de la línea con la que está trabajando. ^bar solo coincidirá con líneas que comienzan con "barra", que ha hecho artificialmente con Substring allí. Es posible que podamos ayudarlo si explica lo que intenta hacer con él.

Por cierto, Substring debería ser significativamente más rápido que la mayoría de las operaciones con expresiones regulares. Me sorprendería si eso es lo que está matando tu rendimiento.

+0

Rendimiento: Si 'Substring' crea un nuevo objeto' String' con una nueva copia del 'Char's subyacente (y estoy bastante seguro de que lo hace), lo harías * además de * la expresión regular que empareja. Y el OP de hecho dijo que el problema era con el uso de la memoria, no con la velocidad, lo que hace que 'Substring' sea el principal sospechoso. Afortunadamente, como muestra @ Maxime [respuesta] (http://stackoverflow.com/questions/5884922/regex-match-startat-and-start-of-string/5885087#5885087), no es necesario de todos modos. –

+0

@Alan - Sí, cometí el error de pensar en el rendimiento en términos de velocidad en lugar de memoria (sin decir que 'Subcadena' no sería un golpe de velocidad, por cierto, solo que era mucho menos que la propia expresión regular) . @Maxime entendió mejor lo que el cartel estaba tratando de hacer, por lo que obtiene mi +1. Re el método 'Substring' - Eso [construye una nueva cadena] (http://msdn.microsoft.com/en-us/library/aka44szs.aspx), ya que las cadenas son inmutables en C#. –

+0

@JustinMorgan En realidad, la inmutabilidad es lo que permitiría no tener que crear una nueva cadena, es posible que la cadena simplemente apunte a la subcadena. La razón por la que esto no tiene que ver tiene que ver con la recolección de basura. – mirhagk