Как проверить есть ли символ в строке c

от admin

How to Check if String contains Specified Substring in C#?

To check if a string str contains specified substring value , or say if specified substring is present in the string, use C# String.Contains(String) method. Call Contains() method on the string str and pass the substring value as argument. Contains() method returns True if string str contains the substring value .

C# Program

Output

If substring value is not present in this string str , then Contains() method returns False.

C# Program

Output

If we would like to ignore case while checking if the substring is present in the string, you may specify to ignore case via StringComparison object as shown in the following example.

C# Program

Output

Conclusion

In this C# Tutorial, we learned how to check if specified substring is present in a given string.

Урок 22. Функции поиска в строках C#

Двадцать вторая часть учебника по основам C# завершает начальное изучение функций манипулирования строками, предоставляемых классом String. В статье рассматриваются методы, доступные для исследования содержимого строк.

Часто необходимо узнать длину строки, например, для проверки ввода пользователя. Класс String предоставляет свойство Length, которое дает нам эту информацию. Свойство возвращает целое число, представляющее количество символов.

Примечание: свойство Length выполняется довольно быстро. При проверке строки на пустоту более эффективно проверять нулевую длину, чем сравнивать строковое значение со String.Empty или»».

Поиск позиции текста в строке

На одном из предыдущих уроков мы рассмотрели метод Substring, который позволяет извлекать символы из заданной позиции в строке. Обратное ему — указать ряд символов и определить позицию, в которой подстрока появляется в строке. Это может быть достигнуто с помощью методов IndexOf и LastIndexOf.

IndexOf принимает параметр, содержащий подстроку для поиска. Если она существует в основной строке, возвращается позиция первого вхождения. Эта позиция называется указателем: целое число, указывающее количество символов между началом строки и найденным текстом. Для начала строки этот индекс равен нулю. Если подстрока не находится в основной строке, метод возвращает -1.

LastIndexOf похож на IndexOf. Однако вместо возврата индекса первого вхождения поискового термина LastIndexOf возвращает позицию последнего вхождения.

Указание границ поиска

IndexOf и LastIndexOf могут быть ограничены с указанием начальной позицию для поиска. С IndexOf можно найти только вхождения указанной подстроки справа или справа от этой позиции. При использовании LastIndexOf находятся только соответствующие подстроки слева от этой позиции.

Поиск может быть ограничен третьим параметром. Этот параметр представляет собой целое число, указывающее максимальное количество символов, которые могут быть рассмотрены. Если совпадение не существует в диапазоне символов, то результат будет равен -1.

Простые проверки на содержание

IndexOf и LastIndexOf полезны при определении точного положения подстрок в строках. Однако, иногда достаточно просто знать, что там имеется такая подстрока. Класс String предоставляет несколько методов для выполнения этих тестов.

StartsWith и EndsWith

StartsWith и EndsWith позволяют определить, начинается или заканчивается строка определенной серией символов. Оба метода принимают аргумент, содержащий строку для поиска соответствия, а возвращают логическое значени. Эти методы учитывают регистр.

Contains метод из .NET 2.0

Последняя строковая функция, ркоторую мы рассмотрим на сегодняшнем уроке – это Contains. Введенный в версии 2.0 .NET framework, он работает аналогично StartsWith и EndsWith, но проверяет, существует ли указанный поисковый символ в любой позиции в основной строке.


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, Уроки по си шарп, string, си шарп,, поиск позиции в строке

Работа со строками

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

В языке C# строковые значения представляет тип string , а вся функциональность работы с данным типом сосредоточена в классе System.String . Собственно string является псевдонимом для класса String. Объекты этого класса представляют текст как последовательность символов Unicode. Максимальный размер объекта String может составлять в памяти 2 ГБ, или около 1 миллиарда символов.

Создание строк

Создавать строки можно, как используя переменную типа string и присваивая ей значение, так и применяя один из конструкторов класса String:

Конструктор String имеет различное число версий. Так, вызов конструктора

6 раз повторит объект из первого параметра, то есть фактически создаст строку «aaaaaa».

Еще один конструктор принимает массив символов, из которых создается строка

Третий использованный выше в примере конструктор позволяет создать строку из части массива символов. Второй параметр передает начальный индекс, с которого извлкаются символы, а третий параметр указывает на количество символов:

Строка как набор символов

Так как строка хранит коллекцию символов, в ней определен индексатор для доступа к этим символам:

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

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

Перебор строк

Класс String реализует интерфейс IEnumerable, благодаря чему строку можно перебрать в цикле foreach как набор объектов char. Также можно с помощью других типов циклов перебрать строку, применяя обращение к символам по индексу:

Читать:
Как сделать чтобы рамка в ворде переходила на следующую страницу

Сравнение строк

В отличие от других классов строки сравниваются по значению их символов, а не по ссылкам:

Многострочные строки

Начиная с C# 11 с помощью трех пар двойных кавычек можно оформить многострочный текст, в том числе с применением интерполяции:

Основные методы строк

Основная функциональность класса String раскрывается через его методы, среди которых можно выделить следующие:

Compare : сравнивает две строки с учетом текущей культуры (локали) пользователя

CompareOrdinal : сравнивает две строки без учета локали

Contains : определяет, содержится ли подстрока в строке

Concat : соединяет строки

CopyTo : копирует часть строки, начиная с определенного индекса в массив

EndsWith : определяет, совпадает ли конец строки с подстрокой

Format : форматирует строку

IndexOf : находит индекс первого вхождения символа или подстроки в строке

Insert : вставляет в строку подстроку

Join : соединяет элементы массива строк

LastIndexOf : находит индекс последнего вхождения символа или подстроки в строке

Replace : замещает в строке символ или подстроку другим символом или подстрокой

Найти, содержит ли строка символ в C++ (разрешено ускорение)

Предположим, у меня есть строка, и я хочу узнать, присутствует ли определенный символ (например, «|») или нет, как лучше и быстрее всего это сделать? Я знаю реализацию поиска строки. Я прошу еще более быструю реализацию, чем эта.

Посмотрите через std::string ссылка, и вы в конечном итоге найдете find . — chris

Зависит от того, какую «форму» строки вы используете. — Mark Garcia

Пожалуйста, избегайте слов «лучший» и «самый быстрый» в названиях; первого следует [почти] всегда избегать, поскольку он добавляет мало ценности («лучший» способ будет дан в «лучшем» ответе), а второго следует избегать, если только нет конкретного тестового примера / сценария, где общий подходы «недостаточно быстры» (а это требует имеющий с чем сначала сравнить!) — user166390

@chris Я знаю, как найти строку, но есть ли что-нибудь более эффективное, чем это, был мой вопрос. — psyche

Вряд ли есть что-то более эффективное. O(n) — лучшее, что вы можете сделать. Реализация стандартной библиотеки должна быть в значительной степени оптимальной. — Fred Larson

7 ответы

Вряд ли есть что-то более эффективное. O(n) — лучшее, что вы можете сделать. Реализация стандартной библиотеки должна быть в значительной степени оптимальной.

от этот источник эмпирический тест, проведенный с помощью компилятора Visual Studio 2013, показывает, что стрхр рутина о 2x быстрее чем std :: строка :: найти реализации.

ответ дан 28 дек ’14, 18:12

Добавление к ответу Тома Таннера. Если вы не хотите выполнять какие-либо априорные вычисления, вы застрянете на O(n), т.е. существует линейная корреляция между длиной строки, в которой вы ищете, и затратами времени. Том предложил создать массив (или вектор) логических значений, указывающих, встречался ли определенный символ. Для индексации строки потребуется O (n) один раз, но затем вы можете проверить любое количество символов в O (1) (постоянное время), если оно включено. Недостатком этого подхода является то, что вам потребуется много памяти (как только вы решите, что вам нужна поддержка Unicode).

В качестве компромисса вы можете использовать std::set или аналогичный, сохраняя только те символы, которые действительно существуют во входной строке. В этом случае потребление памяти будет примерно линейным по отношению к количеству различных символов в строке, но поиск будет осуществляться за O(log n), т. е. логарифмически по времени.

Конечно, вы должны измерить/профилировать, а затем объяснить здесь, для какого варианта использования вы на самом деле оптимизируете. Пока вы этого не сделали, придерживайтесь того, что легче всего понять и прочитать.

ответ дан 06 дек ’14, 13:12

Другой способ — использовать функцию strchr для соответствующей строки c_str:

Не уверен, как это сравнивается со стандартным поиском с точки зрения скорости, хотя.

Позиция найденного символа

ответ дан 09 дек ’14, 16:12

«Если символ не найден, функция возвращает нулевой указатель». Итак, в вашем примере вы вычитаете из указателя NULL в этом случае. Переполнение указателя — UB. — имяноль

@namezero Вот почему мы начинаем с оператора if, прежде чем пытаться получить позицию путем вычитания, поэтому, если символ не найден, мы не пытаемся получить позицию. — афаких

@Peter, да, очевидно, нам нужно предоставить персонажа, которого мы ищем .. (исправлено) — афаких

Есть только один способ сделать это. Просто переберите строку, чтобы проверить, существует ли искомый символ. Вы можете сделать это с помощью string::find функция, которая получает символ и возвращает его первую позицию в строке, или string::npos если значение отсутствует. Вы также можете использовать std::find , который получает два итератора, begin и end и ключевое значение «k» и возвращает итератор, указывающий на первое вхождение k в диапазоне [begin, end] или end if k не был найден. И, конечно же, вы можете реализовать функцию поиска самостоятельно, например:

Подробнее о std::string::find и std::find :

ответ дан 25 дек ’12, 08:12

Учитывая ваше заявление о том, что вам нужно что-то более быстрое, чем string::find, единственное, о чем я могу думать, это создать класс с сильно настроенными операторами присваивания, которые при каждом обновлении строки обновляли внутреннюю таблицу, содержащую первую позицию в строка всех возможных символов (256 для символьной строки, 65536(?) для широкой строки). Это имеет O (1) поиск за счет довольно большой сложности, добавленной к неконстантным операциям.

ответ дан 25 дек ’12, 09:12

Вы можете попробовать следующее:

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c++ string boost or задайте свой вопрос.

Похожие статьи