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
?
+1 Realmente no habría esperado eso. – stema
Sorprendente, pero al menos bien definido. Gracias por excavar eso! – Heinzi
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