Как разбить строку на символы c
Перейти к содержимому

Как разбить строку на символы c

  • автор:

Как разделить строки с помощью String.Split в C#

Метод String.Split создает массив подстрок, разбивая входную строку по одному или нескольким разделителям. Этот метод зачастую является самым простым способом разделить строку по границам слов. Он также используется для разбиения строк по другим конкретным символам или строкам.

Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#.

Следующий код разбивает обычную фразу на массив строк для каждого слова.

string phrase = "The quick brown fox jumps over the lazy dog."; string[] words = phrase.Split(' '); foreach (var word in words) < System.Console.WriteLine($">"); > 

Каждый экземпляр знака разделения создает значение в возвращаемом массиве. Так как массивы в C# не индексируются, каждая строка в массиве индексируется от 0 до значения, возвращаемого Array.Length свойством минус 1:

string phrase = "The quick brown fox jumps over the lazy dog."; string[] words = phrase.Split(' '); for (int i = 0; i < words.Length; i++) < System.Console.WriteLine($"Index : >"); > 

Последовательные знаки разделения создают пустую строку в виде значения в возвращаемом массиве. В следующем примере показано создание пустой строки с использованием символа пробела в качестве разделителя.

string phrase = "The quick brown fox jumps over the lazy dog."; string[] words = phrase.Split(' '); foreach (var word in words) < System.Console.WriteLine($">"); > 

Такое поведение упрощает работу с такими форматами, как файл данных с разделителями-запятыми (CSV), которые представляют табличные данные. Идущие подряд запятые представляют пустой столбец.

Чтобы исключить из возвращаемого массива все пустые строки, можно передать необязательный параметр StringSplitOptions.RemoveEmptyEntries. Для более сложной обработки возвращенной коллекции можно использовать LINQ, чтобы управлять результирующей последовательностью.

String.Split может использовать несколько знаков разделения. В следующем примере используются пробелы, запятые, точки, двоеточия и вкладки в качестве разделительных символов, которые передаются Split в массив. Цикл в конце кода отображает каждое из слов в возвращенном массиве.

char[] delimiterChars = < ' ', ',', '.', ':', '\t' >; string text = "one\ttwo three:four,five six seven"; System.Console.WriteLine($"Original text: ''"); string[] words = text.Split(delimiterChars); System.Console.WriteLine($" words in text:"); foreach (var word in words) < System.Console.WriteLine($">"); > 

Последовательные экземпляры любого разделителя создают пустую строку в выходном массиве:

char[] delimiterChars = < ' ', ',', '.', ':', '\t' >; string text = "one\ttwo :,five six seven"; System.Console.WriteLine($"Original text: ''"); string[] words = text.Split(delimiterChars); System.Console.WriteLine($" words in text:"); foreach (var word in words) < System.Console.WriteLine($">"); > 

Метод String.Split может принимать массив строк (в этом случае в качестве разделителей при анализе целевой строки используются последовательности символов, а не отдельные символы).

string[] separatingStrings = < "; string text = "one'"); string[] words = text.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries); System.Console.WriteLine($" substrings in text:"); foreach (var word in words)

См. также

  • Извлечение элементов из строки
  • Строки
  • Регулярные выражения .NET

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Разбить строку на символы

Можно ли в языке C# когда вводишь строку "string", например: "Собака" - разделить его на буквы "C", "о", "б", "а", "к", "а". Я знаю по функцию "Split", но там надо задавать место разделение, а мне нужно прям каждый символ и пробел тоже!

Отслеживать
28.7k 4 4 золотых знака 40 40 серебряных знаков 81 81 бронзовый знак
задан 21 фев 2018 в 18:06
117 1 1 золотой знак 2 2 серебряных знака 12 12 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

В классе string есть специальный метод ToCharArray , который возвращает массив символов. Также string реализует IEnumerable , поэтому мы можем воспользоваться методом расширения из Linq ToArray . Выбирайте какой нравится (но подозреваю, что первый может работать быстрее, т.к. строке известна ее длина, а второй более универсальный метод и работает для любых последовательностей):

string s = "string"; char[] a = s.ToCharArray(); char[] b = s.ToArray(); 

Ну а если вам не нужно изменять данные, а только читать - можно воспользоваться индексатором: Console.WriteLine(s[0]);

Если вы хотите посимвольно отредактировать строку, то получите массив символов, как написано выше, отредактируйте любые элементы в нем и получите строку из конечного массива (у string есть конструктор, принимающий массив символов):

string s2 = new string(a); 

Вместо массива можно использовать класс StringBuilder - он представляет изменяемую строку, индексатор у него поддерживает как чтение, так и запись:

string s1 = "string"; StringBuilder sb = new StringBuilder(s1); sb[0] = 'b'; sb[1] = 'o'; string s2 = sb.ToString(); Console.WriteLine(s2); 

Разделение строки, на подстроки с сохранением символа разделителя

Сама по себе задача простая, разделил а потом в разделенную подстроку добавить символ разделения. Но нет. Необходимо разделить большую строку, именно что с сохранением символа разделителя в подстроке, нельзя создавать новую строку ! Пытался разделять и через string.split, и через Regex.Split, но результат один и тот же, символ разделителя удаляется. Пробовал такие варианты:

var str = "hello=world="; foreach (var subStr in str.Split('=')) Console.WriteLine(subStr); foreach (var subStr in Regex.Split(str, "=")) Console.WriteLine(subStr); foreach (var subStr in Regex.Split(str, @"(\=)")) Console.WriteLine(subStr); 

Но ни один из них не подходит, их консольные выводы:

hello world hello world hello = world = 

Результат что я ожидаю:

hello= world= 

Отслеживать
задан 22 апр в 14:04
416 1 1 золотой знак 3 3 серебряных знака 13 13 бронзовых знаков

Идите по строке. Если встретили разделитель, выводите часть от прошлого разделителя (или начала строки) до текущего, включая его.

22 апр в 14:07
MemoryExtensions.Split - без создания новых строк, на спанах. Появился в .NET 8.
22 апр в 14:10

@air2921 Используйте регулярные выражение но не Split а match как пример - "([A-Za-z0-9]+\=)" найдет все строки из латинских символов с окончанием "=". И потом просто перечислите все "mach", смотрите тут : metanit.com/sharp/tutorial/7.4.php

22 апр в 14:16

расширенный вариант: создайте таблицу индексов для строки, в эту таблицу помещайте индексы, где индексы обозначают найденные позиции разделителя; по этой таблице в произвольном порядке можете получить любые подстроки [авторское условие про "нельзя создавать новую строку" - полностью выполнено]

22 апр в 18:05

условие выполнено, и даже в некотором смысле - перевыполнено, потому что ни одной строки не создаётся, однако же нужен обслуживающий массив, либо длинный бит-вектор

Разбить строку на слова, при разделителе больше одного символа

Как реализовать функцию, которая бы возвращала указатель на массив строк, чтобы при этом разделитель мог быть как строкой, так и символом? Для строк можно использовать только массив char. Например строку "Hello world" разбить по разделителю "o w", чтобы в итоге получился массив

Отслеживать
задан 2 июн 2020 в 8:18
57 6 6 бронзовых знаков
как split в C#, только чтоб мог быть разделитель не в один символ, а в несколько
2 июн 2020 в 8:35

Ну так найдите подстроку-разделитель (которая может содержать и один символ) в большой строке, и соответственно найденной позиции разделите

2 июн 2020 в 8:37
Поиск подстроки в си : strstr .
2 июн 2020 в 8:37
24 июн 2020 в 17:23

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Самый простой способ - использование функции strtok() :

int main () < char str[] = "Hello, world"; char delim[] = "ow"; char * pch = strtok (str,delim); while (pch != NULL) < printf("%s", pch); pch = strtok (NULL, delim); >return 0; > 

Отслеживать
ответ дан 2 июн 2020 в 9:06
user375573 user375573

так ведь это не соответствует условию задачи. У вас получается на выходе Hell rld , в то время как в примере строка "Hello world" должна быть разбита на Hell и orld .

2 июн 2020 в 10:41

С помощью regex и токен итераторов это делается элементарным образом:

#include #include #include #include #include #include using StringList = std::list; StringList splitString(const std::string &str, const std::string &delimiter) < StringList retval; std::regex regDelim; for (std::sregex_token_iterator iter; iter != std::sregex_token_iterator<>; ++iter) < retval.emplace_back(iter->str()); > return retval; > int main() < std::string str = "hello world"; StringList list = splitString(str, "o w"); for (const std::string &out : list) < std::cout > 

Отслеживать
ответ дан 2 июн 2020 в 8:55
Andrej Levkovitch Andrej Levkovitch
8,057 2 2 золотых знака 20 20 серебряных знаков 51 51 бронзовый знак
кто-нибудь может сказать за что минус то?
2 июн 2020 в 10:37

  • c++
  • алгоритм
  • строки
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8412

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *