c#

时间:2016-01-13 10:36:40

标签: c# replace

我刚写了一个控制台应用程序来替换大量utf-8编码文件中的某个字符串。我需要覆盖这个字符串的大约20个不同的情况,所以我将我的代码片段减少到必要的部分。  守则如下:

foreach (String file in allFIles)
{
    string text = "";
    using (StreamReader r = new StreamReader(file))
    {
        text = r.ReadToEnd();
    }

    if (text.Contains(Case1))
    {
        string textCase1 = "";
        using (StreamReader rCase1Reader = new StreamReader(file))
        {
            textCase1 = rCase1Reader.ReadToEnd().Replace(Case1, Case1Const);
        }
        using (StreamWriter wCase1 = new StreamWriter(file, false, Encoding.UTF8))
        {
            wCase1.Write(textCase1);
        }

        UsedFIles.Add(file);
    }
}

我的问题是,如果我尝试替换看起来像这样的字符串:"partnumber: 58"并且还有一个看起来像这样的字符串"partnumber: 585"

我的问题是,如果当前字符串包含所需的子字符串,另外还有一个像"partnumber: 58""partnumber: 585"这样具有高相似性的字符串,我的代码也会替换高度相似的字符串。 有没有办法可以避免这种行为?

3 个答案:

答案 0 :(得分:1)

读取整个文件,找到您感兴趣的字符串,然后检查它后面的位。假设文件有更多要阅读。

    foreach (String file in allFIles)
    {
        string text = "";
        using (StreamReader r = new StreamReader(file))
        {
            text = r.ReadToEnd();
        }

        int x = text.IndexOf(Case1);
        while(x > -1)
        {
            if (text.Length - x > Case1.Length)
            {
                string nextBit = text.SubString(x + Case1.Length, 1);
                if (IsDelimeter(nextBit))
                {
                    text = Replace(text, x, Case1, Case1Const);
                    x += Case1Const.Length;
                }
            }
            else
            {
                 text = Replace(text, x, Case1 Case1Const);
                 break;
            }
            x = text.IndexOf(Case1, x + 1);
        }

        File.WriteAllText(file, text);
    }

答案 1 :(得分:0)

使用正则表达式

new Regex(@"partnumber: 58$");

答案 2 :(得分:0)

你可以尝试:

var files = new[] { "File1.txt", "File2.txt", "File3.txt" };
// Where the key is the regex pattern to match and the value is the string to replace it with.
var patterns = new Dictionary<string, string>()
{
    { @"partnumber: \d\d", "FooBar" },
};

foreach(var file in files)
{
    string str = File.ReadAllText(file);
    foreach (var pattern in patterns)
        str = Regex.Replace(str, pattern.Key, pattern.Value);
    File.WriteAllText(file, str);
}

此示例使用正则表达式(正则表达式),模式partnumber: \d\d匹配任何以&#39; partnumber开头的字符串:&#39;并以两位数结尾。正则表达式非常强大,您可以使用它来描述您想要匹配的特定情况,以便您可以针对多种模式进行扩展。