C#替换通配符

时间:2010-10-20 14:47:44

标签: .net regex string c#-3.0

我正在申请将该游戏的分辨率更改为所要求的分辨率。

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 x 1200,所以我需要某种通配符来接受persistent extern INDEX m_pixScreenWidth=(INDEX);之间的所有内容。

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分: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位或更多位数)。
  • ;:这与尾随分号匹配

lambda与MatchEvaluator方法的Replace重载一起使用。基本上你正在构建字符串备份。 Groups[1]指的是捕获的第一组文本(参见模式细分中的第一点)。接下来,我们检查命名组Type并检查我们是处理宽度还是高度。我们恰当地替换新值。最后,我们在末尾添加分号以获得最终的替换结果。