Pregunta

¿Cómo puedo reemplazar instancias solitarias de con (LF solo con CRLF) usando una expresión regular en C#?

Lo siento si es una pregunta estúpida, soy nuevo en Regex.

Sé hacerlo usando el plan. String.Replace, como:

myStr.Replace("\n", "\r\n");
myStr.Replace("\r\r\n", "\r\n");

Sin embargo, esto es poco elegante y destruiría cualquier " + " que ya esté en el texto (aunque es poco probable que exista).

¿Fue útil?

Solución

¿Con esto bastará?

[^\r]\n

Básicamente coincide con un ' ' precedido por un carácter que no es ' '.

Si también desea que detecte líneas que comienzan con un solo ' ', intente

([^\r]|$)\n

Lo cual dice que debe coincidir con un ' ' pero solo aquellos que son el primer carácter de una línea o los que son no precedido de ' '

Es posible que haya casos especiales que verificar, ya que está alterando la definición de las líneas en sí y es posible que '$' no funcione demasiado bien.Pero creo que deberías entender la idea.

EDITAR: crédito @Kibbee El uso de mensajes de anticipación es claramente mejor ya que no capturará el carácter anterior coincidente y también debería ayudar con cualquier caso extremo.Así que aquí hay una expresión regular mejor + el código se convierte en:

myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");

Otros consejos

Podría ser más rápido si usas esto.

(?<!\r)\n

Básicamente busca cualquier que no esté precedido por .Lo más probable es que esto sea más rápido, porque en el otro caso, casi todas las letras coinciden con [^ ], por lo que la capturaría y luego buscaría después de eso.En el ejemplo que di, solo se detendría cuando encontrara , y mirarían antes para ver si encontraba .

Estaba intentando hacer el siguiente código en una cadena y no funcionaba.

myStr.Replace("(?<!\r)\n", "\r\n")

Usé Regex.Replace y funcionó

Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")

Supongo que "myStr" es un objeto de tipo String, en ese caso, esto no es una expresión regular. y son los equivalentes de CR y LF.

Mi mejor suposición es que si sabes que tienes un para CADA línea, pase lo que pase, primero debes eliminar cada .Luego reemplace todo con .

La respuesta que da chakrit también sería válida, pero luego necesitas usar expresiones regulares, pero como no dices qué es "myStr"...

Editar: mirar los otros ejemplos me dice una cosa.¿Por qué hacer las cosas difíciles, cuando puedes hacerlas fáciles?, porque hay expresiones regulares, no es lo mismo que "must use" :D

Editar2:Una herramienta es muy valiosa cuando se juega con expresiones regulares, xpath y otras cosas que le dan resultados extraños. ¿Puedo indicarle: http://www.regexbuddy.com/

myStr.Replace("([^\r])\n", "$1\r\n");

$ puede necesitar ser un \

Prueba esto:Reemplazar (Char.ConvertFromUtf32(13), Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13))

Si sé que los finales de línea deben ser CRLF o LF, algo que me funciona es

myStr.Replace("\r?\n", "\r\n");

Esto esencialmente hace lo mismo. neslekkiMLa respuesta es excepto que realiza solo una operación de reemplazo en la cadena en lugar de dos.Esto también es compatible con motores Regex que no admiten búsquedas hacia atrás o referencias hacia atrás negativas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top