Escribí un analizador para un (subconjunto de) BBCode personalizado en Javascript y ahora lo traduje a C# . Este BBCode personalizado permite analizar línea por línea, por lo que tengo regex que me permiten "abrir" la primera línea de la cadena BBCode :
/(^.*$|^.*\r?\n)/
Coincide con una cadena vacía. La primera parte ^.*$ coincide con una cadena simple como "Simple string" (línea única sin CrLf al final). La segunda parte ^.*\r?\n coincide con la primera línea que termina con CrLf .
Esto funciona perfecto en Javascript . Pero mientras ejecutaba las pruebas unitarias en C# noté una diferencia.
Supongamos que tenemos "line1\n" como entrada.
La regex en Javascript coincidirá con ella de la siguiente manera:
^.*$ no coincidirá porque . es cualquier símbolo excepto CrLf y tenemos \n al final.
^.*\r?\n coincidirá ya que tenemos una cadena que comienza con 0 o más símbolos y \n al final.
Ahora en C# funciona diferente:
^.*$ coincidirá (¿por qué?), pero solo la line1 . Por lo tanto, todo el /(^.*$|^.*\r?\n)/ también coincidirá solo con la line1 y el \n desaparecerá.
¿Podría alguien por favor explicar? ¿Hay alguna forma de obligar a la expresión regular de C# regex a comportarse como la expresión regular de Javascript regex en el sentido descrito anteriormente?
La solución más sencilla sería cambiar el orden en el patrón: /(^.*$|^.*\r?\n)/ -> /(^.*\r?\n|^.*$)/ y asi se solucionara el problema...,
pero todavía me gustaría saber la razón detrás de esa diferencia.
Haga clic aquí para ver el código de prueba de C# ...
Para Javascript ver a continuación:
const first_line_pattern = /(^.*$|^.*\r?\n)/ const single_string_pattern = /^.*$/ const line_pattern = /^.*\r?\n/ const input4 = "line1\n" function log(pattern) { let m4 = input4.match(pattern) console.log('~~~~~~~~' + pattern.toString() + '~~~~~~~~~') console.log("'line1\\n':':" + (m4 != null) + ":value: /" + (m4 ? m4[0] : 'no match') + "/") } log(first_line_pattern) log(single_string_pattern) log(line_pattern)¡Gracias por tu tiempo!