2008-08-27 7 views
35

Comment puis-je remplacer les instances seules de \ n avec \ r \ n (LF seul avec CRLF) en utilisant une expression régulière en C#? Désolé si c'est une question stupide, je suis nouveau à Regex.Regex (C#): Remplacer n avec r n

je sais le faire en utilisant le plan String.Replace, comme:

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

Cependant, cela est inélégant, et détruirait tout "\ r + \ r \ n" déjà dans le texte (bien qu'ils ne sont pas susceptibles exister).

Répondre

40

Est-ce que cela va?

[^\r]\n 

Fondamentalement, il correspond à un « \ n » qui est précédé d'un caractère qui n'est pas « \ r ».

Si vous voulez détecter les lignes qui commencent par un seul « \ n » ainsi, essayez

([^\r]|$)\n 

qui dit qu'il doit correspondre à un « \ n », mais seulement ceux qui est le premier caractère d'une ligne ou ceux qui ne sont pas précédé d'un « \ r »

Il pourrait y avoir des cas particuliers pour vérifier puisque vous embêter avec la définition de lignes se le « $ » peut-être pas trop bien. Mais je pense que vous devriez avoir l'idée. L'utilisation de la fonction de prévisualisation s est nettement meilleure car elle ne capture pas le caractère précédent correspondant et devrait également être utile dans tous les cas de contour. Alors, voici une meilleure regex + le code devient:

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

Cela ne fonctionnera pas si la chaîne commence par "\ n". –

+0

ne fonctionne pas pour \ n \ n – Jerome

+5

Devrait être myStr = Regex.Replace (myStr, "(? mcfroob

3

Je suppose que « myStr » est un objet de type String, dans ce cas, ce n'est pas regex. \ r et \ n sont les équivalents pour CR et LF.

Ma meilleure estimation est que si vous savez que vous avez un \ n pour CHAQUE ligne, peu importe quoi, alors vous devriez d'abord enlever tout. Puis remplacez tous \ n par \ r \ n.

La réponse chakrit donne serait aussi aller, mais vous devez utiliser regex, mais puisque vous ne dites pas ce que « myStr » est ...

Edit: en regardant les autres exemples me dit une chose .. pourquoi faire les choses difficiles, quand vous pouvez le faire facilement ?, Parce qu'il y a regex, n'est pas la même que "doit utiliser": D

Edit2: Un outil est très précieux lorsque vous jouez avec regex, xpath, et tout ce que cela vous donne des résultats étranges, puis-je vous diriger vers: http://www.regexbuddy.com/

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

$ peut être un \

55

Il se peut que ce soit plus rapide si vous l'utilisez. Il cherche essentiellement tout ce qui n'est pas précédé d'un \ r. Ce serait probablement plus rapide, parce que dans l'autre cas, presque chaque lettre correspond à [^ \ r], donc cela capturerait cela, et ensuite chercherait le \ n après cela.Dans l'exemple que j'ai donné, il ne s'arrêterait que quand il trouverait un \ n, et les regarderaient avant pour voir s'il trouvait

12

J'essayais de faire le code ci-dessous à une chaîne et ça ne fonctionnait pas.

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

J'utilisé Regex.Replace et cela a fonctionné

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

C'est comme prévu; [Chaîne # Remplacer] (http://msdn.microsoft.com/fr-fr/library/system.string.replace.aspx) n'est pas alimenté par regex. –

1

Essayez ceci: Remplacer (Char.ConvertFromUtf32 (13), Char.ConvertFromUtf32 (10) + Char.ConvertFromUtf32 (13))

1

Si je connais les fins de ligne doit être l'un des CRLF ou LF, quelque chose qui fonctionne pour moi est

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

Ce fait essentiellement th La même réponse neslekkiM sauf qu'il effectue une seule opération de remplacement sur la chaîne plutôt que deux. Ceci est également compatible avec les moteurs Regex qui ne supportent pas les lookbehinds négatifs ou les backreferences.

Questions connexes