2011-10-06 5 views
5

Esto me tiene muy desconcertado. ¿Por qué recibo duplicado reemplazar cadenas en el código siguiente:.NET Regex Reemplazar el carácter desconocido de coincidencia de una sola línea

static void Main(string[] args) 
{ 
    String input = "test"; 
    String pattern = ".*"; 
    String replacement = "replace"; 
    Console.WriteLine(Regex.Replace(input, pattern, replacement)); 
    Console.Read(); 
} 

Esto da salida a la consola:

replacereplace 

entiendo que la expresión regular se pone caracteres de línea de gama coincidente extraños pero no debe haber ninguna. También entiendo que el patrón no puede coincidir con nada, pero claramente la entrada no es nada. Esto sucede en .Net 3.5 y 4.0 y obtengo lo mismo con SingleLine y MultiLine.

Sé que hay varias alternativas que harán lo que estoy esperando, pero me pregunto más sobre qué otro partido. * Piensa en su hallazgo.

Respuesta

4

La razón por la que obtienes dos reemplazos es porque con .* obtienes dos coincidencias: "test" y "".

Si cambia .* a .+ que funcionará de la forma esperada a:

String pattern = ".+"; 

Otra opción es añadir el inicio de ancla cadena:

String pattern = "^.*"; // I know this looks like a smiley 
+1

Me tienes en la línea de llegada :) – FailedDev

+0

Estoy de acuerdo, esto lo arregla pero estaba buscando el por qué. –

+0

@JoshuaBelden Ver respuesta actualizada. – NullUserException

2

Coincide con nada y luego coincide con todo, por lo tanto, tiene dos coincidencias y dos reemplaza.

+0

Nada estúpido. Y por qué nunca me he encontrado con esto antes. –

+2

@JoshuaBelden tal vez lo hiciste pero nunca lo descubriste :) – FailedDev

Cuestiones relacionadas