Https docs microsoft com en us dotnet csharp programming guide strings how tocompare strings
Https docs microsoft com en us dotnet csharp programming guide strings how tocompare strings
How to search strings
You can use two main strategies to search for text in strings. Methods of the String class search for specific text. Regular expressions search for patterns in text.
The C# examples in this article run in the Try.NET inline code runner and playground. Select the Run button to run an example in an interactive window. Once you execute the code, you can modify it and run the modified code by selecting Run again. The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.
The string type, which is an alias for the System.String class, provides a number of useful methods for searching the contents of a string. Among them are Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. The System.Text.RegularExpressions.Regex class provides a rich vocabulary to search for patterns in text. In this article, you learn these techniques and how to choose the best method for your needs.
Does a string contain text?
The String.Contains, String.StartsWith, and String.EndsWith methods search a string for specific text. The following example shows each of these methods and a variation that uses a case-insensitive search:
The preceding example demonstrates an important point for using these methods. Searches are case-sensitive by default. You use the StringComparison.CurrentCultureIgnoreCase enumeration value to specify a case-insensitive search.
Where does the sought text occur in a string?
Finding specific text using regular expressions
The System.Text.RegularExpressions.Regex class can be used to search strings. These searches can range in complexity from simple to complicated text patterns.
The following code example searches for the word «the» or «their» in a sentence, ignoring case. The static method Regex.IsMatch performs the search. You give it the string to search and a search pattern. In this case, a third argument specifies case-insensitive search. For more information, see System.Text.RegularExpressions.RegexOptions.
Pattern | Meaning |
---|---|
the | match the text «the» |
(eir)? | match 0 or 1 occurrence of «eir» |
\s | match a white-space character |
The string methods are usually better choices when you are searching for an exact string. Regular expressions are better when you are searching for some pattern in a source string.
Does a string follow a pattern?
Pattern | Meaning |
---|---|
^ | matches the beginning of the string |
\d | matches exactly 3 digit characters |
— | matches the ‘-‘ character |
\d | matches exactly 4 digit characters |
$ | matches the end of the string |
This single search pattern matches many valid strings. Regular expressions are better to search for or validate against a pattern, rather than a single text string.
How to separate strings using String.Split in C#
The String.Split method creates an array of substrings by splitting the input string based on one or more delimiters. This method is often the easiest way to separate a string on word boundaries. It’s also used to split strings on other specific characters or strings.
The C# examples in this article run in the Try.NET inline code runner and playground. Select the Run button to run an example in an interactive window. Once you execute the code, you can modify it and run the modified code by selecting Run again. The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.
The following code splits a common phrase into an array of strings for each word.
Every instance of a separator character produces a value in the returned array. Consecutive separator characters produce the empty string as a value in the returned array. You can see how an empty string is created in the following example, which uses the space character as a separator.
This behavior makes it easier for formats like comma-separated values (CSV) files representing tabular data. Consecutive commas represent a blank column.
You can pass an optional StringSplitOptions.RemoveEmptyEntries parameter to exclude any empty strings in the returned array. For more complicated processing of the returned collection, you can use LINQ to manipulate the result sequence.
Consecutive instances of any separator produce the empty string in the output array:
Имя метода | Использовать |
---|---|
String.Compare | Сравнивает значения двух строк. Возвращает целочисленное значение. |
String.CompareOrdinal | Сравнивает две строки без учета локального языка и региональных параметров. Возвращает целочисленное значение. |
String.CompareTo | Сравнивает текущий строковый объект с другой строкой. Возвращает целочисленное значение. |
String.StartsWith | Определяет, начинается ли строка с переданной строки. Возвращает логическое значение. |
String.EndsWith | Определяет, заканчивается ли строка переданной строкой. Возвращает логическое значение. |
String.Contains | Определяет, встречается ли символ или строка в другой строке. Возвращает логическое значение. |
String.Equals | Определяет, совпадают ли две строки. Возвращает логическое значение. |
String.IndexOf | Возвращает индекс позиции символа или строки начиная с начала проверяемой строки. Возвращает целочисленное значение. |
String.LastIndexOf | Возвращает индекс позиции символа или строки начиная с конца проверяемой строки. Возвращает целочисленное значение. |
Метод Compare
Статический метод String.Compare позволяет тщательно сравнивать две строки. Этот метод учитывает язык и региональные параметры. Эту функцию можно использовать для сравнения двух строк или подстрок двух строк. Кроме того, имеются перегруженные методы, которые учитывают или не учитывают регистр и вариативность языка и региональных параметров. В таблице ниже приведены три целочисленных значения, которые может возвращать этот метод.
Возвращаемое значение | Условие | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Отрицательное целое число | Первая строка предшествует второй в порядке сортировки. 1 | Первая строка следует за второй в порядке сортировки. В примере ниже метод String.Compare используется для определения относительных значений двух строк. Метод CompareOrdinalМетод String.CompareOrdinal сравнивает два строковых объекта без учета локального языка и региональных параметров. Возвращаемые этим методом значения идентичны значениям, возвращаемым методом Compare в предыдущей таблице. В примере ниже метод CompareOrdinal используется для сравнения значений двух строк. Метод CompareToМетод String.CompareTo сравнивает строку, которую инкапсулирует текущий строковый объект, с другой строкой или объектом. Возвращаемые этим методом значения идентичны значениям, возвращаемым методом String.Compare в предыдущей таблице. Метод EqualsЭтот метод также можно использовать как статический. В примере ниже два строковых объекта сравниваются с помощью статического метода. Методы StartsWith и EndsWithМетоды IndexOf и LastIndexOfС помощью метода String.IndexOf можно определить позицию первого вхождения конкретного символа в строку. Этот метод учитывает регистр и начинает отсчет с начала строки. Он возвращает позицию переданного символа, используя отсчитываемый от нуля индекс. Если символ не удается найти, возвращается значение –1. В примере ниже метод IndexOf используется для поиска первого вхождения символа » l » в строку. Метод String.LastIndexOf аналогичен методу String.IndexOf за исключением того, что он возвращает позицию последнего вхождения конкретного символа в строку. Он учитывает регистр и использует отсчитываемый от нуля индекс. В примере ниже метод LastIndexOf используется для поиска последнего вхождения символа » l » в строку. Сравнение строк в C#Вы сравниваете строки, чтобы ответить на один из двух вопросов: «Равны ли эти две строки?» или «В каком порядке следует размещать эти строки при их сортировке?» Однако эту задачу осложняют факторы, влияющие на сравнение строк: Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#. При сравнении строк вы определяете их порядок. Сравнения используются для сортировки последовательности строк. Если последовательность имеет известный порядок, это упрощает поиск как для программного обеспечения, так и для пользователей. Другие сравнения могут проверять совпадение строк. Эти проверки тождественности похожи на проверки равенства, но позволяют игнорировать некоторые различия, например различия в регистре. Порядковые сравнения по умолчаниюНиже представлены самые распространенные операции по умолчанию: выполните сравнение порядкового номера с учетом регистра. В этом случае String.EqualsStringComparison можно указать аргумент для изменения правил сортировки. Это показано в следующем примере: При порядковых сравнениях строк по умолчанию лингвистические правила не учитываются. В них сравнивается двоичное значение каждого объекта Char в двух строках. Таким образом, в порядковом сравнении по умолчанию также учитывается регистр. Порядковые сравнения без учета регистраЭтот String.Equals(String, StringComparison) метод позволяет указать StringComparison значение StringComparison.OrdinalIgnoreCase для сравнения порядкового номера без учета регистра. Также имеется статический метод String.Compare(String, String, StringComparison), позволяющий проводить порядковое сравнение без учета регистра, если указать значение StringComparison.OrdinalIgnoreCase для аргумента StringComparison. Это показано в следующем коде: При выполнении порядкового сравнения без учета регистра эти методы используют соглашения о регистре для инвариантного языка и региональных параметров. Лингвистические сравненияСтроки могут быть упорядочены с использованием лингвистических правил для текущих значений языка и региональных параметров. Иногда это называется «порядком сортировки слов». При выполнении лингвистического сравнения некоторые нефалунно-цифровые символы Юникода могут иметь специальные весовые коэффициенты. Например, дефис «-» может иметь низкий весовой коэффициент, чтобы слова «co-op» и «coop» находились рядом друг с другом в порядке сортировки. Кроме того, некоторые символы Юникода могут быть эквивалентны последовательности экземпляров Char. В следующем примере используется фраза «Они танцуют на улице». На немецком языке с «ss» (U+0073 U+0073) в одной строке и «ß» (U+00DF) в другой. Лингвистически (в Windows) буквы «ss» равнозначны немецкому символу эсцет «ß» в языках «en-US» и «de-DE». Сравнения с использованием определенных языков и региональных параметровЭтот пример сохраняет объекты CultureInfo для языков «en-US» и «de-DE». Сравнения выполняются с использованием объекта CultureInfo, чтобы учесть язык и региональные параметры. Используемые значения языка и региональных параметров влияют на операции лингвистического сравнения. В следующем примере показаны результаты сравнения двух предложений на немецком с использованием языка и региональных параметров «en US» и «de-DE»: Сравнения с учетом языка и региональных параметров обычно используются для сравнения и сортировки строк, вводимых пользователями. Символы и правила сортировки этих строк могут различаться в зависимости от языкового стандарта компьютера пользователя. Даже строки, содержащие идентичные символы, могут быть отсортированы по-разному, в зависимости от языка и региональных параметров текущего потока. Лингвистическая сортировка и поиск строк в массивахПриведенные ниже примеры показывают, как сортировать и искать строки в массиве с помощью лингвистического сравнения, зависящего от текущих значений языка и региональных параметров. Используйте статические методы Array, которые принимают параметр System.StringComparer. В этом примере показано, как сортировать массив строк с использованием текущих значений языка и региональных параметров: После сортировки массива можно выполнить поиск записей с помощью двоичного поиска. Двоичный поиск начинается с середины коллекции, чтобы определить, какая половина коллекции содержит искомую строку. Каждое последующее сравнение делит оставшуюся часть коллекции пополам. Массив сортируется с использованием StringComparer.CurrentCulture. Локальная функция ShowWhere отображает сведения о том, где была найдена строка. Если строка не найдена, возвращаемое значение указывает, где бы оно находилось, если было бы найдено. Порядковая сортировка и поиск в коллекцияхПосле сортировки по списку строк можно осуществлять двоичный поиск. В приведенном ниже примере показан поиск в отсортированном списке с использованием той же функции сравнения. Локальная функция ShowWhere показывает, где находится или находился бы искомый текст: Всегда используйте один и тот же тип сравнения для сортировки и поиска. Использование разных типов сравнения приводит к неожиданным результатам. Рекомендации по использованию строкПри сравнении строк избегайте следующих действий: Явное задание сравнений строк
Рекомендуется выбрать перегрузку, не использующую значения по умолчанию, по следующим причинам. Некоторые перегрузки с параметрами по умолчанию (те, которые выполняют поиск Char в экземпляре строки) выполняют порядковое сравнение, в то время как другие (выполняющие поиск строки в экземпляре строки) учитывают язык и региональные параметры. Сложно запомнить, какое значение по умолчанию использует тот или иной метод, перегрузки легко перепутать. В общем случае рекомендуется вызывать метод, который не зависит от значений по умолчанию, поскольку это делает назначение кода однозначным. Это, в свою очередь, делает код более читаемым и упрощает отладку и обслуживание. В следующем примере рассматриваются вопросы, возникшие в предыдущем примере. Он явно демонстрирует, что используется порядковое сравнение и что различия регистра игнорируются. Подробные сведения о сравнении строкСравнение строк является основой многих связанных со строками операций, в частности сортировки и проверки на равенство. Строки сортируются в определенном порядке: если my отображается до string в сортированном списке строк, текст my должен быть меньше или равен тексту string. Кроме того, неявное сравнение определяет равенство. Операция сравнения возвращает 0 для строк, которые она считает равными. Правильно интерпретировать это следующим образом: ни одна из строк не меньше другой. Наиболее значимые операции со строками включают обе следующие процедуры или хотя бы одну из них: сравнение с другой строкой и выполнение правильно определенной операции сортировки. Можно скачать таблицы коэффициентов сортировки — набор текстовых файлов, которые содержат сведения о весовых коэффициентах символов, используемых в операциях сортировки и сравнения для операционных систем Windows, а также последнюю версию таблицы параметров сортировки по умолчанию для элементов Юникод — таблицу весовых коэффициентов сортировки для Linux и macOS. Конкретная версия таблицы коэффициентов сортировки в Linux и macOS зависит от установленной в системе версии библиотек International Components for Unicode (ICU). Сведения о версиях ICU и реализуемых в них версиях Юникода см. на странице Downloading ICU (Скачивание ICU). Однако оценка двух строк на равенство или порядок сортировки не дает единственно верного результата; результат также зависит от критериев, используемых для сравнения строк. В частности, операции сравнения строк, которые являются порядковыми или основаны на правилах учета регистра или сортировки текущего языка и региональных параметров или инвариантного языка и региональных параметров (независимые от языкового стандарта региональные параметры на основе английского языка), могут давать разные результаты. Сравнение строк с использованием текущего языка и региональных параметровОдним из критериев является использование правил текущего языка и региональных параметров при сравнении строк. В сравнениях, основанных на текущем языке и региональных параметрах, используется текущий язык, региональные параметры или языковой стандарт потока. Если пользователь не задал язык и региональные параметры, используется настройка по умолчанию в окне Региональные параметры на панели управления. Следует всегда использовать сравнения на основе текущего языка и региональных параметров, если речь идет о лингвистически релевантных данных и данных, отражающих взаимодействие с пользователем, где важны язык и региональные параметры. Сравнения без учета регистра, где используются текущий язык и региональные параметры, выполняются так же, как сравнения с учетом языка и региональных параметров с той разницей, что регистр игнорируется в соответствии с правилами текущего языка и региональных параметров потока. Это поведение может также проявляться в порядке сортировки. Сравнения, использующие семантику текущего языка и региональных параметров, используются по умолчанию для следующих методов. При лингвистической интерпретации нелингвистических строковых данных, а также если строковые данные определенного языка и региональных параметров интерпретируются с использованием правил другого языка, могут возникать малозаметные и не столь малозаметные ошибки. Типичный пример — проблема турецкого I. Почти во всех латинских алфавитах, включая американский английский, символ i (\u0069) является строчной версией символа I (\u0049). Это правило учета регистра быстро становится значением по умолчанию для тех, кто программирует для этих языков. Однако в турецком алфавите (tr-TR) используется I с точкой — İ (\u0130), которая является прописной версией i. В турецком языке также есть строчная i без точки, ı (\u0131), прописной для которой является I. Эта же особенность имеется и в азербайджанском языке («az»). Таким образом, допущения о прописной версии буквы i или строчной версии буквы I не являются правильными для всех языков. При использовании перегрузок по умолчанию для сравнения строк они будут меняться в зависимости от языков и региональных параметров. Если сравниваются нелингвистические данные, при использовании перегрузок по умолчанию может быть получен нежелательный результат, как показывает следующий пример с попыткой сравнить строки file и FILE без учета регистра. В этом случае, так как file: должен интерпретироваться как нелингвистический идентификатор без учета языка и региональных параметров, нужно писать код, как показано в следующем примере. Порядковые операции со строкамиПорядковые сравнения — это сравнения строк, в которых каждый байт каждой строки сравнивается без лингвистической интерпретации; например, windows не равно Windows. По сути, это вызов функции strcmp среды выполнения C. Используйте такое сравнение, когда контекст определяет, что строки должны точно совпадать, или требует использования консервативной политики соответствия. Кроме того, порядковое сравнение — это самая быстрая операция сравнения, потому что при расчете результата не применяются лингвистические правила. В следующем примере выполняется сравнение с учетом языка и региональных параметров строки Aa с аналогичной строкой, содержащей несколько внедренных символов NULL между А и а, и показано, почему две строки рассматриваются как равные: При этом строки не считаются равными, если выполняется порядковое сравнение, как показано в следующем примере: Порядковые сравнения без учета регистра — это следующий наиболее консервативной подход к решению задачи. В этих сравнениях почти всегда игнорируется регистр. Так, windows совпадает с Windows. При работе с символами ASCII эта политика эквивалентна сравнению StringComparison.Ordinalза исключением того, что стандартные правила регистра ASCII игнорируются. Следовательно, любой символ в последовательности [A, Z] (\u0041–\u005A) соответствует соответствующему символу в последовательности [a, z] (\u0061–\007A). Правила регистра за пределами диапазона ASCII используют таблицы инвариантного языка. Поэтому следующее сравнение эквивалентно следующему сравнению (но выполняется быстрее): Эти сравнения по-прежнему выполняются очень быстро. Строковые операции, использующие инвариантный язык и региональные параметрыСравнения с использованием StringComparison.InvariantCulture и StringComparison.Ordinal работают одинаково в строках ASCII. Однако StringComparison.InvariantCulture принимает лингвистические решения, которые могут не подходить для строк, которые нужно интерпретировать как набор байтов. Объект CultureInfo.InvariantCulture.CompareInfo заставляет метод Compare интерпретировать определенные наборы символов как эквивалентные. Например, следующие элементы эквивалентны только в инвариантном языке. InvariantCulture: a + ̊ = å Символ LATIN SMALL LETTER A «a» (\u0061), если он находится рядом с символом «+» ̊» (\u030a), интерпретируется как ЛАТИНСКАЯ МАЛЕНЬКАЯ БУКВА A С КОЛЬЦОМ НАД символом «å» (\u00e5). Как показано в следующем примере, это поведение отличается от порядкового сравнения. При интерпретации имен файлов, файлов cookie или чего-либо еще, где могут появляться такие сочетания, как å, порядковые сравнения по-прежнему являются наиболее понятным и подходящим поведением. В целом в инвариантном языке очень мало свойств, которые могли бы сделать его полезным для сравнения. Он выполняет сравнения с учетом лингвистических параметров, что не позволяет гарантировать полную эквивалентность символов, однако не подходит для отображения на любом языке. Одной из оснований использования StringComparison.InvariantCulture для сравнения является необходимость сохранить упорядоченные данные для идентичного отображения на разных языках. Например, если к приложению прилагается крупный файл данных, содержащий список сортированных идентификаторов для отображения, добавление в этот список потребует вставки элементов с сортировкой в инвариантном стиле. Выбор элемента StringComparison для вызова своего методаВ следующей таблице приведено сопоставление семантического контекста строк с элементом перечисления StringComparison:
|