Question

Comment puis-je remplacer les instances isolées de par (LF seul avec CRLF) à l'aide d'une expression régulière en C# ?

Désolé si c'est une question stupide, je suis nouveau sur Regex.

Je sais le faire en utilisant un plan 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 tous les " + " déjà présents dans le texte (même s'ils sont peu susceptibles d'exister).

Était-ce utile?

La solution

Ça fera l'affraire?

[^\r]\n

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

Si vous souhaitez également qu'il détecte les lignes commençant par un seul «   », essayez

([^\r]|$)\n

Ce qui dit qu'il doit correspondre à un ' ' mais uniquement à ceux qui sont le premier caractère d'une ligne ou à ceux qui sont pas précédé de ' '

Il peut y avoir des cas particuliers à vérifier puisque vous jouez avec la définition des lignes elle-même, le « $ » pourrait ne pas fonctionner très bien.Mais je pense que vous devriez avoir l'idée.

MODIFIER: credit @Kibbee L'utilisation de look-ahead s est clairement meilleure car elle ne capturera pas le caractère précédent correspondant et devrait également aider dans tous les cas extrêmes.Voici donc une meilleure regex + le code devient :

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

Autres conseils

Cela pourrait être plus rapide si vous l'utilisez.

(?<!\r)\n

Il recherche essentiellement tout qui n'est pas précédé d'un .Ce serait probablement plus rapide, car dans l'autre cas, presque toutes les lettres correspondent à [^ ], donc il capturerait cela, puis rechercherait le après cela.Dans l'exemple que j'ai donné, il ne s'arrêterait que lorsqu'il trouverait un , et ils regarderaient avant cela pour voir s'il trouvait

J'essayais d'appliquer le code ci-dessous à une chaîne et cela ne fonctionnait pas.

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

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

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

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

Ma meilleure hypothèse est que si vous savez que vous avez un pour CHAQUE ligne, quoi qu'il arrive, vous devez d'abord supprimer chaque .Remplacez ensuite tous les par .

La réponse donnée par chakrit irait également, mais vous devez alors utiliser regex, mais comme vous ne dites pas ce qu'est "myStr"...

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

Edit2 :Un outil est très précieux lorsque vous manipulez des regex, XPath, etc., qui vous donne des résultats étranges, puis-je vous indiquer : http://www.regexbuddy.com/

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

$ devra peut-être être un \

Essaye ça:Remplacer(Char.ConvertFromUtf32(13), Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13))

Si je sais que les fins de ligne doivent être CRLF ou LF, quelque chose qui fonctionne pour moi est

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

Cela fait essentiellement la même chose neslekkiMLa réponse, sauf qu'elle n'effectue qu'une seule opération de remplacement sur la chaîne au lieu de deux.Ceci est également compatible avec les moteurs Regex qui ne prennent pas en charge les recherches négatives ou les références arrière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top