38 votes

Regex (C#): Remplacer \n par \r\n

Comment puis-je remplacer les instances uniques de \n par \r\n (LF seul avec CRLF) en utilisant une expression régulière en C# ?

Je sais le faire en utilisant simplement String.Replace, comme :

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

Cependant, cela n'est pas élégant et détruirait tout "\r+\r\n" déjà présent dans le texte (bien qu'ils ne soient probablement pas présents).

62voto

Kibbee Points 36474

Il pourrait être plus rapide si vous utilisez ceci.

(?

`

Essentiellement, il cherche tout \n qui n'est pas précédé d'un \r. Cela serait très probablement plus rapide, car dans l'autre cas, presque chaque lettre correspond à [^\r], donc il capturerait cela, puis chercherait le \n après cela. Dans l'exemple que j'ai donné, il s'arrêterait seulement lorsqu'il trouverait un \n, puis regarderait avant cela pour voir s'il a trouvé \r

`

44voto

chakrit Points 29562

Est-ce que cela fera l'affaire?

[^\r]\n

Essentiellement, cela correspond à un '\n' qui est précédé d'un caractère qui n'est pas '\r'.

Si vous voulez qu'il détecte également les lignes commençant par un seul '\n', essayez alors

([^\r]|$)\n

Cela signifie qu'il devrait correspondre à un '\n', mais seulement ceux qui sont le premier caractère d'une ligne ou ceux qui ne sont pas précédés de '\r'.

Il peut y avoir des cas spéciaux à vérifier car vous modifiez la définition des lignes elles-mêmes, le '$' pourrait ne pas fonctionner très bien. Mais je pense que vous devriez comprendre l'idée.

ÉDITER: crédit @Kibbee Utiliser des look-ahead est clairement mieux car cela ne capturera pas le caractère précédent correspondant et devrait également aider avec les cas particuliers. Voici donc une meilleure regex + le code devient:

myStr = Regex.Replace(myStr, "(?

12voto

wanted Points 93

J'essayais de faire le code ci-dessous à une chaîne de caractères et cela ne fonctionnait pas.

myStr.Replace("(?

`

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

Regex.Replace( oldValue, "(?

`

3voto

neslekkiM Points 416

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

Mon meilleur pari est que si vous savez que vous avez un \n pour CHAQUE ligne, peu importe ce qui se passe, alors vous devriez d'abord supprimer chaque \r. Ensuite, remplacez tous les \n par \r\n.

La réponse que chakrit donne fonctionnerait aussi, mais alors vous devez utiliser regex, mais puisque vous ne dites pas ce que "myStr" est...

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

Modifier 2 : Un outil est très précieux lors de la manipulation de regex, xpath, et autres qui vous donnent des résultats étranges, puis-je vous recommander : http://www.regexbuddy.com/

1voto

Chris Marasti-Georg Points 17023
myStr.Replace("([^\r])\n", "$1\r\n");

$ may need to be a \

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X