2010-10-20 13 views
1

Je fais une application pour changer la résolution de ce jeu, à la résolution demandée.C# Remplacer le caractère générique

StreamReader reader = new StreamReader(@"C:\Documents and Settings\ARTech\Bureaublad\PersistentSymbols.ini");//Reads the file. 
string content = reader.ReadToEnd();//Puts the content of the file, into a variable. 
reader.Close(); 
string replace = "persistent extern INDEX m_pixScreenWidth=(INDEX)" + txtWidth.Text + ";"; 
content = content.Replace("persistent extern INDEX m_pixScreenWidth=(INDEX)1920;", replace);//Replaces the ScreenWidth of the game to the requested number. 
replace = "persistent extern INDEX m_pixScreenHeight=(INDEX)" + txtHeight.Text + ";"; 
content = content.Replace("persistent extern INDEX m_pixScreenHeight=(INDEX)1200;", replace);//Replaces the ScreenHeight of the game to the requested number. 

StreamWriter writer = new StreamWriter(@"C:\Documents and Settings\ARTech\Bureaublad\PersistentSymbols.ini"); 
writer.Write(content);//Saves the changes. 
writer.Close(); 

Le problème est que la résolution n'est pas toujours 1920 x 1200, donc je besoin d'une sorte de caractère générique qui accepte tout entre persistent extern INDEX m_pixScreenWidth=(INDEX) et ;.

Répondre

2

Vous pouvez regarder dans un lecteur/graveur INI, comme ce projet: An INI file handling class using C#. Ensuite, vous pouvez saisir la clé souhaitée et définir la valeur de manière appropriée.

Sinon, vous pourriez écrire un regex comme celui-ci:

string input = @"persistent extern INDEX m_pixScreenWidth=(INDEX)1920; 
... 
persistent extern INDEX m_pixScreenHeight=(INDEX)1200;"; 
string width = "800"; 
string height = "600"; 

string pattern = @"(persistent extern INDEX m_pixScreen(?<Type>Width|Height)=\(INDEX\))\d+;"; 
string result = Regex.Replace(input, pattern, 
        m => m.Groups[1].Value 
         + (m.Groups["Type"].Value == "Width" ? width : height) 
         + ";"); 

Console.WriteLine(result); 

Répartition du motif:

  • (persistent extern INDEX m_pixScreen(?<Type>Width|Height)=\(INDEX\)): Votre texte prévu, y compris la hauteur/largeur et le texte d'index, est placé dans un groupe de capture par les parenthèses d'ouverture et de fermeture. Nous y reviendrons plus tard.
  • (?<Type>Width|Height): un groupe de capture nommé qui alterne entre largeur et hauteur pour capturer les deux. De cette façon, un modèle peut gérer les deux types de texte.
  • \(INDEX\): les parenthèses doivent être échappées pour être appariées littéralement puisqu'elles ont une signification particulière dans regex si elles ne sont pas échappées (utilisées pour le regroupement comme fait ci-dessus).
  • \d+: \d correspond à un chiffre [0-9]. Le + fait correspondre au moins un nombre (1 ou plusieurs chiffres).
  • ;: cela correspond à la virgule de fin

Un lambda est utilisé avec la surcharge MatchEvaluator de la méthode Replace. Essentiellement, vous construisez la chaîne de sauvegarde. Groups[1] fait référence au premier groupe de texte capturé (voir le premier point ci-dessus dans la répartition des motifs). Ensuite, nous vérifions le groupe nommé Type et vérifions s'il s'agit d'une largeur ou d'une hauteur. Nous remplaçons la nouvelle valeur de manière appropriée. Enfin, nous ajoutons ce point-virgule à la fin pour obtenir le résultat de remplacement final.

Questions connexes