在stringbuilder中搜索字符串并替换整行C#

时间:2015-07-27 14:57:03

标签: c# regex string stringbuilder

我使用的是C#,我有一个stringbuilder sb,其中有一些行包含由制表符分隔的字符串,如下所示:

1.14332    534335    4452435435
1.32332    534535    4354535435
1.34432    524335    4353235435
1.44332    534435    4352235435
.
.
.

我想要做的是在这个字符串构建器中搜索一个字符串,如果找到这个字符串,那么我想用另一个新字符串替换包含该字符串的整行。例如,如果我要搜索的单词是1.32332,那么1.32332 534535 4354535435 中的这一行sb将替换为新的子字符串,例如1.32332 664535 1154536665。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

在我看来,你想要格式化这样的模式:

String.Format(@"{0}\s*?\d+\s*?\d+", searchValue)

因为您要查找的行的开头可能会有所不同。在您的示例中,格式化后的模式如下所示:

@"1\.32332\s*?\d+\s*?\d+"

将找到您感兴趣的替换行。话虽如此,试一试:

StringBuilder sb = new StringBuilder();
sb.AppendLine("1.14332    534335    4452435435");
sb.AppendLine("1.32332    534535    4354535435");
sb.AppendLine("1.34432    524335    4353235435");
sb.AppendLine("1.44332    534435    4352235435");

Console.WriteLine("Before: ");
Console.WriteLine(sb);

// Have to escape the decimal point to be part of the regex pattern
string searchValue = @"1\.32332";
string replaceValue = "1.32332    664535    1154536665";
Match match = Regex.Match(sb.ToString(), String.Format(@"{0}\s*?\d+\s*?\\d+", searchValue));
if (match.Success)
{
    sb.Replace(match.Value, replaceValue);
}

Console.WriteLine("After: ");
Console.WriteLine(sb);

结果:

Before:
1.14332    534335    4452435435
1.32332    534535    4354535435
1.34432    524335    4353235435
1.44332    534435    4352235435

After:
1.14332    534335    4452435435
1.32332    664535    1154536665
1.34432    524335    4353235435
1.44332    534435    4352235435

答案 1 :(得分:1)

您可以使用带有多行选项的正则表达式替换行,例如替换包含" mystring"的行使用" mynewstring":

var stringToMatch = Regex.Escape("mystring");
var lines = sb.ToString();
var regex = new Regex(string.Format(@"^.*\W{0}\W.*$", stringToMatch), RegexOptions.Multiline);
string result = regex.Replace(lines, "mynewstring");

答案 2 :(得分:1)

如果你不想使用正则表达式你也可以从stringbuilder中提取行并用新字符串替换它们。

        StringBuilder yourStringBuilder; //Your stringbuilder
        StringBuilder newStringBuilder = new StringBuilder(); // The result will store here
        string search = "1.32332";  // to search
        string replace = "1.32332    664535    1154536665"; // to replace

        var newsbstr = ReplaceWithLine(yourStringBuilder, search, replace).ToArray();


        // put array of strings into new stringbuilder.
        foreach (string s in newsbstr)
        {
            newStringBuilder.AppendLine(s);
        }
    }

此方法将从stringbuilder逐行返回字符串。如果在行中找到的字符串将返回replace,否则它将返回提取的行(sbline.ToString())。

    private static IEnumerable<string> ReplaceWithLine(StringBuilder sb, string search,string replace)
    {
        StringBuilder sbline = new StringBuilder();

        for (int i = 0; i < sb.Length; i++)
        {
            char ch = sb[i];

            if (ch == '\n' || i == sb.Length - 1)
            {
                if (sbline.ToString().Contains(search))
                {
                    yield return replace;
                }
                else
                {
                    yield return sbline.ToString();
                }

                sbline.Clear();
            }
            else
            {
                sbline.Append(ch);
            }
        }
    }

最后,您可以从IEnumerable创建数组,然后将它们放入新的stringbuilder中。