删除“|”之间的字符串和 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;