【问题标题】:How can I replace a unknown string in a file?如何替换文件中的未知字符串?
【发布时间】:2012-07-29 04:58:54
【问题描述】:

目前我正在编写一个库来简化 INI 文件的读写,当键和值不存在但我无法轻松更新值时,我已经让阅读器工作和写入,我尝试了各种方法来替换字符串,但没有一个是实用的,程序需要旧值

这是我从这里尝试过的一个示例:Regular Expression to replace unknown value in text file - c# and asp.net

Regex rgx = new Regex(@"SQL-SERVER-VERSION="".*?""");
string result = rgx.Replace(input, replacement);

但每次我修改该代码以替换值时,它最终都会替换键,从而导致应用下次尝试读取文件时出错。

这是我目前使用的代码:

private string wholedata;
private void UpdateKey(string key, string path, string newval)
{
    try
    {
        using (StreamReader s = new StreamReader(File.Open(path, FileMode.Open)))
        {
            wholedata = s.ReadToEnd();
            Regex rgx = new Regex(key + ".*?");
            string result = rgx.Replace(wholedata, newval);
            MessageBox.Show(result);
        }
        using (StreamWriter s = new StreamWriter(File.Open(path, FileMode.OpenOrCreate)))
        {
            s.Write(wholedata);
        }
     }
     catch (Exception e)
     {
     }
}

【问题讨论】:

  • 为什么要重写系统已经知道怎么做?看看这个项目:codeproject.com/Articles/1966/…。无论如何,您正在编写旧值(wholedata),而不是新值(结果)。这可能是根本原因。
  • 感谢您这么快的回复!我希望实现我自己的版本,虽然看到这个我可能只是在此基础上构建它,谢谢! :)
  • 我的第一个问题是它是否未知 - 你怎么知道它在那里 :-)
  • @PreetSangha 我认为这就是.*? 在密钥未知后的位

标签: c# regex string random replace


【解决方案1】:

为什么要重写系统已经知道该怎么做?看看这个项目:An INI file handling class using C#。您还应该知道,Xml 在 .Net 框架中占有重要地位。使用配置框架或序列化/反序列化的简单设置对象并不少见。我不知道你的要求,但它可以启发我们描述一下你为什么要使用ini文件。

也就是说,您正在写入旧值(wholedata),而不是新值(结果)。这可能是根本原因。

当你调用Regex.Replacestring.Replace也是如此)时,它实际上是生成一个新的字符串,并不会改变传入参数的字符串。

【讨论】:

    【解决方案2】:

    将正则表达式更改为

    Regex rgx = new Regex(@"(?<=SQL-SERVER-VERSION="").*?(?="")");
    

    这将匹配 .*?,前提是存在前缀和后缀((?&lt;=)(?=) 分组)

    【讨论】:

    • 谢谢,但我决定使用@Steve B 提供的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多