2008-08-27 14 views
35

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

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

sé hacerlo utilizando 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 "\ r + \ r \ n" ya en el texto (aunque no es probable existir).

Respuesta

40

¿Esto hacer?

[^\r]\n 

Básicamente coincide con un '\ n' que está precedido de un carácter que no es '\ r'.

Si desea que le permite detectar las líneas que comienzan con un simple '\ n', así, a continuación, tratar

([^\r]|$)\n 

que dice que debe coincidir con un '\ n', pero sólo los que es el primer carácter de una línea o los que están no precedido con '\ r'

Puede haber casos especiales para comprobar ya que está jugando con la definición de las líneas en sí el '$' podría no funcionar demasiado bien. Pero creo que deberías entender la idea.

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

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

Esto no funcionará si la cadena comienza con "\ n". –

+0

no funciona para \ n \ n – Jerome

+5

Debe ser myStr = Regex.Replace (myStr, "(? mcfroob

3

supongo que "myStr" es un objeto de tipo String, en ese caso, esto no se regex. \ ry \ n son los equivalentes para CR y LF.

Mi mejor conjetura es que si usted sabe que tiene un \ n para cada línea, no importa qué, entonces primero debe despojar a cabo todos los \ r. Luego reemplace todo \ n con \ r \ n.

La respuesta chakrit da también iría, pero entonces es necesario utilizar expresiones regulares, pero ya que no dicen lo que "myStr" es ...

Editar: mirando a los otros ejemplos me dice una cosa .. ¿por qué hacer las cosas difíciles, cuando puedes hacerlo fácil ?, porque hay expresiones regulares, no es lo mismo que "debe usar": D

Edit2: una herramienta es muy valiosa cuando jugueteas con regex, xpath, y otras cosas que le dan resultados extraños, le puedo indicar: http://www.regexbuddy.com/

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

$ puede necesitar ser un \

55

Puede ser más rápido si utiliza esto.

(?<!\r)\n 

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

12

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

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

que utilizan Regex.Replace y funcionó

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

Eso es como se esperaba; [String # Replace] (http://msdn.microsoft.com/en-us/library/system.string.replace.aspx) no tiene potencia regex. –

1

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

1

Si conozco a los finales de línea debe ser uno de CRLF o LF, algo que funciona para mí es

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

Esto esencialmente hace º La misma respuesta de neslekkiM, excepto que solo realiza 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 negativas o referencias inversas.