2011-12-23 17 views
35

me he dado cuenta lo siguiente:

var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline); // true 
var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false 

estoy confundido. La documentación de RegexOptions dice:

Multilínea: modo multilínea. Cambia el significado de^y $ para que coincidan al principio y al final, respectivamente, de cualquier línea, y no solo al principio y al final de la cadena completa.

Puesto que C# y VB.NET se utilizan principalmente en el mundo de Windows, yo supongo que la mayoría de los archivos procesados ​​por aplicaciones .NET utilizan saltos de línea CRLF (\r\n) en lugar de saltos de línea LF (\n). Aún así, parece que el analizador de expresiones regulares .NET no reconoce un salto de línea CRLF como un al final de la línea.

Sé que podría solucionar esto, por ejemplo, haciendo coincidir Line1\r?$, pero todavía me parece extraño. ¿Este es realmente el comportamiento previsto del analizador de expresiones regulares .NET o me perdí alguna opción oculta UseWindowsLinebreaks?

Respuesta

46

De MSDN:

Por defecto, $ coincide sólo con el final de la cadena de entrada. Si especifica la opción RegexOptions.Multiline, coincide con el carácter de nueva línea (\ n) o al final de la cadena de entrada. Sin embargo, no coincide con la combinación de caracteres de retorno de carro/avance de línea. Para combinarlos con éxito, use la subexpresión \ r? $ En lugar de solo $.

http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline

así que no puedo decir por qué (la compatibilidad con expresiones regulares de otras lenguas?), Pero por lo menos es la intención.

+2

+1 Realmente no habría esperado eso. – stema

+2

Sorprendente, pero al menos bien definido. Gracias por excavar eso! – Heinzi

+4

Curiosamente, es ampliamente aceptado (y definido) en implementaciones de expresiones regulares que $ coincide con _position_, ** not ** a _literal_. Entonces, para MSDN decir que coincide con un carácter de nueva línea tampoco es del todo correcto. – rfmodulator

Cuestiones relacionadas