在 stringbuilder 中搜索字符串并替换整行 C#
Search for a string in a stringbuilder and replace the whole line C#
我使用的是 C#,我有一个 stringbuilder sb
,其中有一些行包含由制表符分隔的字符串,如下所示:
1.14332 534335 4452435435
1.32332 534535 4354535435
1.34432 524335 4353235435
1.44332 534435 4352235435
.
.
.
我想要做的是在这个字符串生成器中搜索一个字符串,如果找到这个字符串,那么我想用另一个新字符串替换包含这个字符串的整行。因此,例如,如果我要搜索的词是 1.32332
,那么 sb
中的这一行 1.32332 534535 4354535435
将被替换为新的子字符串,例如 1.32332 664535 1154536665
。有什么建议吗?
您可以使用带有多行选项的正则表达式来替换行,例如将包含 "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");
在我看来,您希望像这样格式化模式:
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
如果您不想使用正则表达式,您也可以从 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 逐行 return 字符串。如果在行中找到字符串,它将 return replace
否则它将 return 提取的行 (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。
我使用的是 C#,我有一个 stringbuilder sb
,其中有一些行包含由制表符分隔的字符串,如下所示:
1.14332 534335 4452435435
1.32332 534535 4354535435
1.34432 524335 4353235435
1.44332 534435 4352235435
.
.
.
我想要做的是在这个字符串生成器中搜索一个字符串,如果找到这个字符串,那么我想用另一个新字符串替换包含这个字符串的整行。因此,例如,如果我要搜索的词是 1.32332
,那么 sb
中的这一行 1.32332 534535 4354535435
将被替换为新的子字符串,例如 1.32332 664535 1154536665
。有什么建议吗?
您可以使用带有多行选项的正则表达式来替换行,例如将包含 "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");
在我看来,您希望像这样格式化模式:
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
如果您不想使用正则表达式,您也可以从 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 逐行 return 字符串。如果在行中找到字符串,它将 return replace
否则它将 return 提取的行 (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。