【问题标题】:Replace text in file regardless of the end of the line无论行尾如何替换文件中的文本
【发布时间】:2021-10-15 17:50:58
【问题描述】:

我一直在开发一种工具来修改文本文件以更改游戏的图形设置。一些设置示例如下:

sg.ShadowQuality=0
ResolutionSizeX=1440
ResolutionSizeY=1080
bUseVSync=False

我希望能够找到 sg.ShadowQuality=(其余行,无论此文本后面是什么),并替换它。这样用户就可以将其设置为 10 然后 1 而无需检查 10 和 1 等。 基本上,我试图找出我需要使用什么来查找/替换文本文件中的字符串而不知道字符串的结尾。 我当前的代码如下所示:

FileInfo GameUserSettings = new FileInfo(@SD + GUSDirectory);
GameUserSettings.IsReadOnly = false;
string text = File.ReadAllText(SD + GUSDirectory);
text = text.Replace("sg.ShadowQuality=0", "sg.ShadowQuality=" + Shadows.Value.ToString());
File.WriteAllText(SD + GUSDirectory, text);
text = text.Replace("sg.ShadowQuality=1", "sg.ShadowQuality=" + Shadows.Value.ToString());
File.WriteAllText(SD + GUSDirectory, text);

SD + GUSDirectory 是文本文件的位置。 该文件必须有只读关闭才能编辑,否则游戏可以将设置恢复回来,因此需要这样做。(在任何更改后恢复为只读打开,它只是不包含在提供的此代码中)

【问题讨论】:

  • 这看起来基本上是一个 INI 文件,所以你想考虑只使用一个库(例如IniParser)。

标签: c# text replace


【解决方案1】:

你可以这样做,如果你使用正则表达式匹配所有行

FileInfo gameUserSettings = new FileInfo(Path.Combine(@SD, GUSDirectory)); //name local varaible in camelCase, use Path.Combine to combine paths
gameUserSettings.IsReadOnly = false;

string text = File.ReadAllText(gameUserSettings.FullName); //use the fileinfo you just made rather than make the path again

text = Regex.Replace(text, "^sg[.]ShadowQuality=.*$", $"sg.ShadowQuality={Shadows.Value}", RegexOptions.Multiline); //note switch to interpolated strings

File.WriteAllText(gameUserSettings.FullName, text);

那个正则表达式是多行的(所以 ^ 和 $ 有不同的含义):

^sg[.]ShadowQuality=.*$
  • 行开头^(不是输入开头)
  • 后跟sg
  • 后跟句号.(在字符类中,它失去了“任何字符”的含义)
  • 后跟ShadowQuality=
  • 后跟任意数量的任意字符(.*)
  • 跟在行尾$(不是输入结束)

关键位是“任意数量的任意字符”,它可以处理文件中的值127hello 等等..

替换为:

$"sg.ShadowQuality={Shadows.Value}"

这是一个内插字符串;一种更简洁的方式来表示混合常量内容(​​硬编码字符)和可变内容的字符串。当 $tring 包含一个 { 时,它会从字符串中“中断”并返回到正常的 c# 代码中,这样您就可以编写解析为将包含在字符串中的值的代码 -> 如果 Shadows.Value 是例如decimal?1.23 将变为 1.23

你也可以格式化数据;调用 $"to one dp is {Shadows.Value:F1}" 会产生 "to one dp is 1.2" - 1.23 被 F1 格式化为小数点后 1 位,就像调用 Shadows.Value.ToString("F1") 一样

【讨论】:

  • 我做了类似的事情并将所有设置读入字典,没有值。然后用户可以更改值,最后我将所有设置写回文件中。使用正则表达式也可以。我的项目是公开的,您可以在此处访问文件:github.com/RudolfJan/ToolkitForTSW/tree/master/ToolkitForTSW/…CSettingsManager 是要启动的类。
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 2017-11-03
  • 1970-01-01
  • 2012-06-24
  • 2013-05-13
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多