powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / разбить строку с разделителями
9 сообщений из 9, страница 1 из 1
разбить строку с разделителями
    #39223482
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите как разбить строку в C#, так чтоб сами разделители тоже попали в результат

проще наверное на примере

допустим, есть строка
Код: plaintext
"123 456                     aaa  ccc"

нужно получить в результате такую коллекцию

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
"123", 
" ", 
"465", 
"                     ", 
"aaa", 
"  ", 
"ссс"

в этом примере разделитель только пробел
реально может быть любой символ из некоторого набора
(в том числе nonwhitespace)
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39223486
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно ли я понимаю, что момент перехода к следующему элементу коллекции (точка разбивки) определяется одним из двух признаков:
- переход от разделителя к неразделителю
- переход от неразделителя к разделителю
?
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39223489
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, красивого решения на базе чистой регулярки или Regex.Replace+Split в голову не пришло.
Так что тупое сканирование:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
      var t = "123@456@@@@@@@@@@@@@@@@@@@@@aaa@@ccc";

      var separators = new HashSet<char>() { ' ', ',', '.', '@' };
      var output = new List<string>();
      if (t != null && t.Length > 0)
      {
        var checker = separators.Contains(t[0]);
        var cut = 0;
        for (int i = 1; i < t.Length; i++)
        {
          if (separators.Contains(t[i]) ^ checker)
          {
            output.Add(t.Substring(cut, i - cut));
            cut = i;
            checker = !checker;
          }
        }
        output.Add(t.Substring(cut, t.Length - cut));
      }
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39223491
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПравильно ли я понимаю, что момент перехода к следующему элементу коллекции (точка разбивки) определяется одним из двух признаков:
- переход от разделителя к неразделителю
- переход от неразделителя к разделителю
?

да
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39223492
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProВ общем, красивого решения на базе чистой регулярки или Regex.Replace+Split в голову не пришло.
Так что тупое сканирование:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
      var t = "123@456@@@@@@@@@@@@@@@@@@@@@aaa@@ccc";

      var separators = new HashSet<char>() { ' ', ',', '.', '@' };
      var output = new List<string>();
      if (t != null && t.Length > 0)
      {
        var checker = separators.Contains(t[0]);
        var cut = 0;
        for (int i = 1; i < t.Length; i++)
        {
          if (separators.Contains(t[i]) ^ checker)
          {
            output.Add(t.Substring(cut, i - cut));
            cut = i;
            checker = !checker;
          }
        }
        output.Add(t.Substring(cut, t.Length - cut));
      }



так-то и я могу, я думал может как получше можно
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39223496
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
            var s = "123 456                     aaa  ccc";
            var matches = Regex.Matches(s, @"(\w+) | (\s+)", RegexOptions.IgnorePatternWhitespace);

            foreach (Match m in matches)
                Console.WriteLine(m.Value);
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39223519
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Код: c#
1.
2.
3.
4.
5.
            var s = "123 456                     aaa  ccc";
            var matches = Regex.Matches(s, @"(\w+) | (\s+)", RegexOptions.IgnorePatternWhitespace);

            foreach (Match m in matches)
                Console.WriteLine(m.Value);



идею понял, спс
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39228280
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grokАлексей К
Код: c#
1.
2.
3.
4.
5.
            var s = "123 456                     aaa  ccc";
            var matches = Regex.Matches(s, @"(\w+) | (\s+)", RegexOptions.IgnorePatternWhitespace);

            foreach (Match m in matches)
                Console.WriteLine(m.Value);



идею понял, спс

попробовал тут вместо Regex.Matches - Regex.Split

если Matches работает корректно,
то Split почему-то каждая вторая строка пустая

объясните плиз, почему
...
Рейтинг: 0 / 0
разбить строку с разделителями
    #39228603
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grok,

Можно выделить два состояния:читаем набор без разделителей или читаем набор разделителей и соответсвенно записывать в результат только при смене состояния. Потребуется также аккумулирующий буфер в который переносится конкатенацией текущий символ. Имхо будет более естественное поведение для алгоритма.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / разбить строку с разделителями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]