Donc, j'ai ce fichier texte contenant quelques chemins vers des fichiers. Ces chemins doivent être partiellement remplacés. Cela doit être insensible à la casse, alors j'ai essayé de le faire avec Regex.

Une partie du fichier ressemble à ceci:

PATH1         = d:\Software\system\SETUP\folder1
PATH2         = d:\Software\system\SETUP\folder2
PATH3         = d:\Software\system\SETUP

La première partie: d:\Software\system doit être remplacée par c:\Software\system

J'ai essayé cela avec le code suivant:

string text = File.ReadAllText(filePath);

string pattern = "d:\\Software\\system";
string replace = "C:\\Software\\system";

string newText = Regex.Replace(text, pattern, replace, RegexOptions.IgnoreCase);
File.WriteAllText(filePath, newText);

Cela ne change cependant rien au fichier. J'ai également utilisé des points d'arrêt pour analyser la valeur du nouveau texte après la ligne Remplacer, et cela n'a rien à voir avec l'écriture du fichier.

Toute aide est très appréciée!

1
larzz11 5 janv. 2016 à 14:24

3 réponses

Meilleure réponse

Utilisez un {{ X0}} méthode qui échappera à votre motif littéral:

Voici un code de test:

var text = @"PATH1         = d:\Software\system\SETUP\folder1
PATH2         = d:\Software\system\SETUP\folder2
PATH3         = d:\Software\system\SETUP";
string pattern = "d:\\Software\\system";
string replace = "C:\\Software\\system";

string newText = Regex.Replace(text, Regex.Escape(pattern), replace.Replace("$", "$$"), RegexOptions.IgnoreCase);
//                                   ^^^^^^^^^^^^^
Console.WriteLine(newText);

Une autre façon consiste à utiliser Microsoft.VisualBasic.Strings.Replace que vous devez utiliser avec CompareMethod.Text:

Text
Optionnel. Résultats dans des comparaisons de chaînes basées sur un ordre de tri du texte insensible à la casse déterminé par les paramètres régionaux de votre système .
Ce type de comparaison est utile si vos chaînes contiennent tous les caractères de texte et que vous souhaitez les comparer en tenant compte des équivalences alphabétiques telles que l'insensibilité à la casse et des lettres étroitement liées. Par exemple, vous pouvez considérer que A et a sont égaux, et que Ä et ä viennent avant B et b.

Code:

var newText = Microsoft.VisualBasic.Strings.Replace(text, 
               pattern, 
               replace, 
               Compare: Microsoft.VisualBasic.CompareMethod.Text);
2
Wiktor Stribiżew 5 janv. 2016 à 11:50

Dans votre motif, \ S signifie Pas d'espace blanc et \ s signifie espace blanc. Vous devez rendre les backslashes littéraux en les échappant avec leurs propres backslashes:

Alors soit:

string pattern = @"d:\\Software\\system";

Ou:

string pattern = "d:\\\\Software\\\\system";
0
Neal 5 janv. 2016 à 11:34

Pour les chemins de fichiers, vous pouvez convertir le chemin, le motif et le remplacement .ToUpper(), puis faire un string newPath = path.Replace(pattern, replace); normal

P.S. Si la casse de la chaîne de chemin qui en résulte est importante, la solution Regex.Escape est meilleure.

0
Dmitri Trofimov 5 janv. 2016 à 11:43