удалить строку между "|" и "," в конструкторе строк в C# - PullRequest
2 голосов
/ 19 июня 2020

Я использую VS2019 в Windows7. Я хочу удалить строку между "|" и "," в StringBuilder.

То есть я хочу преобразовать StringBuilder из

"578.552|0,37.986|317,38.451|356,23"

в

"578.552,37.986,38.451,23"

Я пробовал Substring, но потерпел неудачу, какой еще метод я мог бы использовать для этого?

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Если у вас есть огромный 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;
1 голос
/ 19 июня 2020

Если вы не очень хорошо знакомы с шаблонами Regex, вы можете написать свой собственный метод для фильтрации данных; это всегда поучительное и хорошее практическое упражнение:

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('|', ',', ','));
1 голос
/ 19 июня 2020

StringBuilder на самом деле не настраивается на много путем проверки и изменения в середине . Это будет довольно легко сделать, если у вас есть string (возможно, через Regex), но StringBuilder? не так много. На самом деле StringBuilder - это в основном , предназначенное для добавления только вперед, поэтому ответ будет:

, если вам не нужны эти символы, почему вы их добавляете?

Может быть, просто используйте здесь 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

Здесь перевод регулярного выражения - «труба (\|), не жадный что-нибудь (.*?), за которым следует запятая, где следующая запятая не является частью совпадения ( (?=,)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...