J'ai une grande chaîne de texte (c'est un code source), et je dois parcourir les occurrences d'une certaine chaîne (qui peut se produire à un nombre aléatoire d'endroits), et remplacer chacune d'elles par une valeur différente, ce que je ne peux pas faire en utilisant Replace () en considérant qu'elle les remplace toutes par une valeur unique.
donc par exemple cette chaîne de texte:
RAND_STRING1 RAND_STRING2 RAND_STRING3
doit être converti en ceci:
REPLACE_ME REPLACE_ME REPLACE_ME
J'ai lu tout le texte en même temps et je l'ai déjà dans une variable de chaîne.
3 Réponses :
Vous devez parcourir le fichier ligne par ligne. Gardez un compteur de nr instances trouvées.
Si la ligne actuelle contient votre chaîne REPLACE_ME, remplacez cette chaîne par votre chaîne aléatoire et ajoutez la valeur du compteur, mettez à jour le compteur + 1 et continuez à la ligne suivante.
Le résultat sera que chaque instance de votre replace_me sera remplacée par une valeur unique.
Regex.Replace() accepte un délégué MatchEvaluator avec lequel vous pouvez accomplir ce que vous voulez:
var random = new Random();
var result = Regex.Replace(input, substring, (m) => random.Next().ToString());
// or
var result = Regex.Replace(input, substring, (m) => {
var randomString = someAPIClient.GetRandomValueFromRandomValueService();
var encoded = Encoding.UTF8.GetBytes(randomString);
return Convert.ToBase64String(encoded);
});
La valeur du result sera "VALUE1 VALUE2 VALUE3" .
L'appel Regex.Escape() est redondant pour cet exemple particulier ( "REPLACE_ME" ne contient aucun caractère spécial qui doit être échappé), mais je suggère de prendre l'habitude d'échapper des sous-chaînes littérales quoi qu'il en soit - surtout si vous voulez accepter entrée fournie par l'utilisateur!
Bien sûr, vous pouvez faire tout ce que vous voulez dans l'évaluateur:
var input = "REPLACE_ME REPLACE_ME REPLACE_ME";
var substring = Regex.Escape("REPLACE_ME");
var substitute = "VALUE";
var counter = 1;
var result = Regex.Replace(input, substring, (m) => $"{prefix}{counter++}");
Votre imagination fixe la limite ici :)
Est-ce C # 9 ou C # 8? Je veux dire que vous avez utilisé l'expression lambda (m) => .
@Bigeyes: l'expression lambda est un remplaçant pour le délégué MatchEvaluator requis par la surcharge Regex.Replace citée. Il ne nécessite pas C # 9. Voir stackoverflow.com/a/31326693
Je suis presque sûr que cela fonctionne (avec un lambda) aussi loin que C # 3 / .NETFX 3.5 :)
exemple regex:
string[] textFile = File.ReadAllLines("myFile.txt");
var i = 0;
//Stringbuilder will be the contents of our new text file.
StringBuilder sb = new StringBuilder();
//iterate through each line, making our replacements and appending to the string builder
foreach (string line in textFile)
{
var result = Regex.Replace(
line, "REPLACE_ME", m => string.Format("{0}{1}",m.Value,++i), RegexOptions.IgnoreCase);
sb.AppendLine(result);
}
//Write to new file like so:
StreamWriter sw = new StreamWriter("newFile.txt");
sw.Write(sb.ToString()));
sw.Close();
Lisez-vous le texte par morceaux avec un
TextReaderou tout à la fois?@aybe tout à la fois, et je l'ai déjà dans une variable de chaîne.
Est-ce que cela répond à votre question? C # Remplacer + numéro différent pour chaque remplacement
Ce sont ces types de questions et réponses «comment faire» qui sont précisément celles dont ce site a besoin, à condition qu'elles soient suffisamment limitées dans leur portée (ce qui est celui-ci).
@devNull bien que les deux utilisent la même approche (Regex.Replace), je pense que le code de Jessen est beaucoup plus facile à suivre et globalement une meilleure réponse, merci à tous, je l'ai eu.
@devNull aussi je pense que le titre de cette question est vraiment vague et que les gens auront probablement du mal à le trouver en googlant, "C # Remplacer + un numéro différent à chaque remplacement" n'est pas vraiment clair.
@OneAndOnly, j'ai trouvé cette question en googlant :) Je vois ce que tu veux dire
@CamiloTerevinto oups! J'aurais probablement mieux lu avec un
,là haha.@OneAndOnly, j'ai édité un peu cette question, j'espère que cela a plus de sens pour vous maintenant
@CamiloTerevinto beaucoup mieux maintenant, merci.