2010-10-20 2 views
1

Я делаю приложение, чтобы изменить разрешение этой игры на требуемое разрешение.C# Заменить подстановочный знак

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(); 

Проблема заключается в том, что разрешение не всегда 1920 х 1200, так что мне нужно какое-то шаблона, который принимает все между persistent extern INDEX m_pixScreenWidth=(INDEX) и ;.

ответ

2

Вы можете посмотреть в INI чтения/записи, такие как этот проект: An INI file handling class using C#. Затем вы можете взять желаемый ключ и установить значение соответствующим образом.

В противном случае, вы могли бы написать регулярное выражение, как этот один: пробой

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); 

Узора:

  • (persistent extern INDEX m_pixScreen(?<Type>Width|Height)=\(INDEX\)): Ваш ожидаемого текст, в том числе высоты/шириной и текст индекса, помещаются в группа захвата по открывающей и закрывающейся скобках. Мы поговорим об этом позже.
  • (?<Type>Width|Height): названная группа захвата, которая чередуется между шириной и высотой для захвата обоих. Таким образом, один шаблон может обрабатывать оба типа текста.
  • \(INDEX\): круглые скобки должны быть экранированы буквально, поскольку они имеют особое значение в регулярном выражении, если они не привязаны (используются для группировки, как сделано выше).
  • \d+: \d соответствует цифре [0-9]. + позволяет совместить хотя бы одно число (1 или более цифр).
  • ;: это соответствует косую точкой с запятой

Лямбда используется с MatchEvaluator перегрузки метода Replace. По существу, вы создаете строку. Groups[1] относится к первой группе захваченного текста (см. Первый пункт выше в разбивке по шаблону). Затем мы проверяем именованную группу Type и проверяем, имеем ли мы дело с шириной или высотой. Подставляем новое значение соответствующим образом. Наконец, мы добавим точку с запятой в конце, чтобы получить окончательный результат замены.

Смежные вопросы