【问题标题】:Realtime Search and Replace实时搜索和替换
【发布时间】:2012-09-09 06:04:30
【问题描述】:

我有一个包含大量数字的文件,我想减少这些数字以构建一个新文件。首先,我使用File.ReadAllText 提取所有文本,然后从包含以逗号或空格分隔的数字的每一行中拆分并提取数字。扫描后,我用新减少的数字替换每个找到的数字的所有出现,但问题是这种方法容易出错,因为有些数字被多次替换

这是我正在使用的代码:

List<float> oPaths = new List<float>();
List<float> nPaths = new List<float>();
var far = File.ReadAllText("paths.js");
foreach(var s in far.Split('\n'))
{
    //if it starts with this that means there are some numbers
    if (s.StartsWith("\t\tpath:"))
    {
        var paths = s.Substring(10).Split(new[]{',', ' '});
        foreach(var n in paths)
        {
            float di;
            if(float.TryParse(n, out di))
            {
                if(oPaths.Contains(di)) break;
                oPaths.Add(di);
                nPaths.Add(di * 3/4);
            }
        }
    }
}

//second iteration to replace old numbers with new ones
var ns = far;
    for (int i = 0; i < oPaths.Count; i++)
    {
        var od = oPaths[i].ToString();
        var nd = nPaths[i].ToString();
        ns = ns.Replace(od, nd);
    }
    File.WriteAllText("npaths.js", ns);

如您所见,上述方法是多余的,因为它不会实时替换字符串。也许我的脑袋已经满了,但我只是迷失了如何去做。有什么想法吗?

谢谢。

【问题讨论】:

    标签: c# string replace


    【解决方案1】:

    我认为正则表达式可以在这里提供帮助

    string text = File.ReadAllText(file);
    string newtext = Regex.Replace(text, @"\b(([0-9]+)?\.)?[0-9]+\b", m =>
        {
            float f;
            if (float.TryParse(m.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out f)) f *= 3.0f / 4;
            return f.ToString();
        });
    File.WriteAllText(file, newtext);
    

    【讨论】:

    • 好极了,比我的还快。谢谢
    【解决方案2】:

    在输入问题后,我意识到答案是逐个字符地迭代并相应地替换。这是我用来让它工作的代码:

    string nfar = "";
    var far = File.ReadAllText("paths.js");
    bool neg = false;
    string ccc = "";
    for(int i = 0; i < far.Length; i++)
    {
        char c = far[i];
        if (Char.IsDigit(c) || c == '.')
        {
            ccc += c;
            if (far[i + 1] == ' ' || far[i + 1] == ',')
            {
                ccc = neg ? "-" + ccc : ccc;
                float di;
                if (float.TryParse(ccc, out di))
                {
                    nfar += (di*0.75f).ToString();
                    ccc = "";
                    neg = false;
                }
            }
        }
        else if (c == '-')
        {
            neg = true;
        }
        else
        {
            nfar += c;
        }
    }
    File.WriteAllText("nfile.js", nfar);
    

    欢迎评论和/或优化建议。

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 2014-09-13
      • 2019-05-05
      • 2011-02-20
      • 2012-12-25
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多