删除“|”之间的字符串和 C# 中的 stringbuilder 中的“,”
remove string between "|" and "," in stringbuilder in C#
我在Windows7中使用VS2019。
我想在 StringBuilder
.
中删除 "|"
和 ","
之间的字符串
也就是说,我想从
转换成StringBuilder
"578.552|0,37.986|317,38.451|356,23"
到
"578.552,37.986,38.451,23"
我试过Substring
但失败了,我还能用什么其他方法来实现这个目标?
StringBuilder
并没有真正通过检查和变异 在中间 进行很多设置。一旦你有了 string
(可能通过 Regex
),这将很容易做到,但是 StringBuilder
?没那么多。实际上,StringBuilder
主要是 用于仅向前追加,所以答案是:
if you didn't want those characters, why did you add them?
也许这里只使用string
版本;然后:
var s = "578.552|0,37.986|317,38.451|356,23";
var t = Regex.Replace(s, @"\|.*?(?=,)", ""); // 578.552,37.986,38.451,23
这里的正则表达式翻译是“管道(\|
),非贪婪的任何东西(.*?
),后跟一个逗号,其中后面的逗号不是匹配的一部分((?=,)
).
如果您不太了解正则表达式模式,您可以编写自己的自定义方法来过滤数据;它总是具有指导意义和很好的练习:
public static String RemoveDelimitedSubstrings(
this StringBuilder s,
char startDelimitter,
char endDelimitter,
char newDelimitter)
{
var buffer = new StringBuilder(s.Length);
var ignore = false;
for (var i = 0; i < s.Length; i++)
{
var currentChar = s[i];
if (currentChar == startDelimitter && !ignore)
{
ignore = true;
}
else if (currentChar == endDelimitter && ignore)
{
ignore = false;
buffer.Append(newDelimitter);
}
else if (!ignore)
buffer.Append(currentChar);
}
return buffer.ToString();
}
你显然会像这样使用它:
var buffer= new StringBuilder("578.552|0,37.986|317,38.451|356,23");
var filteredBuffer = b.RemoveDelimitedSubstrings('|', ',', ','));
如果你有一个 巨大的 StringBuilder
并且这就是为什么将它转换为 String
并应用正则表达式不是一个选项,
您可以尝试实施有限状态机 (FSM):
StringBuilder source = new StringBuilder("578.552|0,37.986|317,38.451|356,23");
int state = 0; // 0 - keep character, 1 - discard character
int index = 0;
for (int i = 0; i < source.Length; ++i) {
char c = source[i];
if (state == 0)
if (c == '|')
state = 1;
else
source[index++] = c;
else if (c == ',') {
state = 0;
source[index++] = c;
}
}
source.Length = index;
我在Windows7中使用VS2019。
我想在 StringBuilder
.
"|"
和 ","
之间的字符串
也就是说,我想从
转换成StringBuilder
"578.552|0,37.986|317,38.451|356,23"
到
"578.552,37.986,38.451,23"
我试过Substring
但失败了,我还能用什么其他方法来实现这个目标?
StringBuilder
并没有真正通过检查和变异 在中间 进行很多设置。一旦你有了 string
(可能通过 Regex
),这将很容易做到,但是 StringBuilder
?没那么多。实际上,StringBuilder
主要是 用于仅向前追加,所以答案是:
if you didn't want those characters, why did you add them?
也许这里只使用string
版本;然后:
var s = "578.552|0,37.986|317,38.451|356,23";
var t = Regex.Replace(s, @"\|.*?(?=,)", ""); // 578.552,37.986,38.451,23
这里的正则表达式翻译是“管道(\|
),非贪婪的任何东西(.*?
),后跟一个逗号,其中后面的逗号不是匹配的一部分((?=,)
).
如果您不太了解正则表达式模式,您可以编写自己的自定义方法来过滤数据;它总是具有指导意义和很好的练习:
public static String RemoveDelimitedSubstrings(
this StringBuilder s,
char startDelimitter,
char endDelimitter,
char newDelimitter)
{
var buffer = new StringBuilder(s.Length);
var ignore = false;
for (var i = 0; i < s.Length; i++)
{
var currentChar = s[i];
if (currentChar == startDelimitter && !ignore)
{
ignore = true;
}
else if (currentChar == endDelimitter && ignore)
{
ignore = false;
buffer.Append(newDelimitter);
}
else if (!ignore)
buffer.Append(currentChar);
}
return buffer.ToString();
}
你显然会像这样使用它:
var buffer= new StringBuilder("578.552|0,37.986|317,38.451|356,23");
var filteredBuffer = b.RemoveDelimitedSubstrings('|', ',', ','));
如果你有一个 巨大的 StringBuilder
并且这就是为什么将它转换为 String
并应用正则表达式不是一个选项,
您可以尝试实施有限状态机 (FSM):
StringBuilder source = new StringBuilder("578.552|0,37.986|317,38.451|356,23");
int state = 0; // 0 - keep character, 1 - discard character
int index = 0;
for (int i = 0; i < source.Length; ++i) {
char c = source[i];
if (state == 0)
if (c == '|')
state = 1;
else
source[index++] = c;
else if (c == ',') {
state = 0;
source[index++] = c;
}
}
source.Length = index;