【问题标题】:String replacement not working as expected字符串替换未按预期工作
【发布时间】:2012-10-31 22:13:33
【问题描述】:

我的问题是:

我有一个 .ini 文件,我正在阅读如下:

    StreamReader sr = new StreamReader(txtb_path.Text, Encoding.Default);

    StringBuilder content = new StringBuilder();

    // schreibt Zeile für Zeile auf den StringBuilder bis das Ende der Datei erreicht ist
    while (!sr.EndOfStream)
        content.AppendLine(sr.ReadLine());

    // StringBuilder als String an die TextBox übergeben
    this.textBox1.Text = content.ToString();

然后我应用以下正则表达式:

    string regex = @"^FensterGemerkt.+?\d+\.\d+\.\d+\,\ \d{2}:\d{2}:\d{2}\ :\ -{1}?\d+\,.*?$"; //@"^Fenster.*$";

    RegexOptions options = RegexOptions.Multiline;

    // search in
    string input = content.ToString();
    //txtb_count.Text = "anzahl zeilen: " + Convert.ToString(content.Capacity);

    // run regex
    MatchCollection matches = Regex.Matches(input, regex, options);              

    // MessageBox.Show(Convert.ToString(matches.Count));
    txtb_count.Text = Convert.ToString(matches.Count);
    string cleanup ="";          

    foreach (Match match in matches)
    {
        // clean the ini
        cleanup = Regex.Replace(input, match.Value, "");

        // Output all matches                    
        textBox2.Text = textBox2.Text + "\n" + match.Value;
    }

.ini 文件如下所示:

1
FensterGemerkt=12.11.2012, 10:42:37 : -32000,32744--31840,32768
Fenster=-32000,32744,160,24

2
FensterGemerkt=12.11.2012, 10:49:46 : 0,44-1024,768
Fenster=0,44,1024,724

我想要的是,如果正则表达式匹配第一个条目:

FensterGemerkt=12.11.2012, 10:42:37 : -32000,32744--31840,32768

...然后替换或删除它。

我的应用程序有效,但仅适用于 .ini 文件中的最后一个条目。 我想我的foreach 有问题,但我想不通。

【问题讨论】:

    标签: c# regex foreach output ini


    【解决方案1】:

    有更好的方法可以做到这一点,但对您的问题最简单的答案是因为您将 cleanup 重置为始终替换最后一个值。

    试试

        string cleanup =input;          
    
        foreach (Match match in matches)
        {
            // clean the ini
            cleanup = Regex.Replace(cleanup, match.Value, "");
    
            // Output all matches                    
            textBox2.Text = textBox2.Text + "\n" + match.Value;
        }
    

    更好的解决方案是使用 Linq:

      Regex regex=new Regex(@"^FensterGemerkt.+?\d+\.\d+\.\d+\,\ \d{2}:\d{2}:\d{2}\ :\ -{1}?\d+\,.*?$"; //@"^Fenster.*$",RegexOptions.MultiLine);
      string cleanup=regex.Replace(input,string.Empty);
      string[] matches=regex.Matches(input).OfType<Match>().Select(m=>m.Value).ToArray();
      txtb_count.Text = Convert.ToString(matches.Length);
      textBox2.Text = string.Join('\n',matches);
    

    【讨论】:

    • 感谢您为 foreach 提供的解决方案,我尝试让我的应用程序运行,然后我尝试使用 linq 的解决方案,为什么我使用它的性能更好?
    • @FrankFischer for each 解决方案正在重新评估整个输入字符串,以便在cleanup = regex.Replace(input,string.Empty) 更有效的每个迭代中进行替换。 Linq 行可能更有效(尚未测量),因为您不会重复连接 (+=) 字符串并且您只更新 Text 属性一次。
    猜你喜欢
    • 2015-02-22
    • 2019-08-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多