Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для поиска текста в строках можно использовать две основные стратегии. Методы класса String выполняют поиск определенного текста. Регулярные выражения ищут шаблоны в тексте.
Тип строки , который является псевдонимом для System.String класса, предоставляет множество полезных методов для поиска содержимого строки. Среди них Contains, , StartsWithEndsWith, IndexOf, LastIndexOf. Класс System.Text.RegularExpressions.Regex предоставляет широкий словарь для поиска шаблонов в тексте. В этой статье вы узнаете об этих методах и о том, как выбрать лучший метод для ваших потребностей.
Содержит ли строка текст?
Методы String.Contains, String.StartsWith и String.EndsWith ищут строку на наличие определенного текста. В следующем примере показаны все эти методы и вариант, использующий поиск без учета регистра:
string factMessage = "Extension methods have all the capabilities of regular static methods.";
// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");
// Simple comparisons are always case sensitive!
bool containsSearchResult = factMessage.Contains("extension");
// Raw string literals can work here because the output doesn't begin with "
Console.WriteLine($"""Contains "extension"? {containsSearchResult}""");
// For user input and strings that will be displayed to the end user,
// use the StringComparison parameter on methods that have it to specify how to match strings.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"""Starts with "extension"? {ignoreCaseSearchResult} (ignoring case)""");
bool endsWithSearchResult = factMessage.EndsWith(".", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");
В предыдущем примере показано важное значение для использования этих методов. Поиски по умолчанию чувствительны к регистру . Вы используете значение перечисления StringComparison.CurrentCultureIgnoreCase для указания поиска без учета регистра.
Где находится искомый текст в строке?
Методы IndexOf и LastIndexOf также ищут текст в строках. Эти методы возвращают расположение искомого текста. Если текст не найден, возвращается -1. В следующем примере показан поиск первого и последнего вхождения слова "методы" и отображается текст между ними.
string factMessage = "Extension methods have all the capabilities of regular static methods.";
// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");
// This search returns the substring between two strings, so
// the first index is moved to the character just after the first string.
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string str2 = factMessage.Substring(first, last - first);
Console.WriteLine($"""Substring between "methods" and "methods": '{str2}'""");
Поиск определенного текста с помощью регулярных выражений
Класс System.Text.RegularExpressions.Regex можно использовать для поиска строк. Эти поиски могут варьироваться от простых до сложных шаблонов текста.
В следующем примере кода выполняется поиск слова "the" или "their" в предложении, игнорируя регистр. Статический метод Regex.IsMatch выполняет поиск. Вы предоставляете ему строку для поиска и шаблона поиска. В этом случае третий аргумент указывает поиск без учета регистра. Дополнительные сведения см. в разделе System.Text.RegularExpressions.RegexOptions.
Шаблон поиска описывает текст, который вы ищете. В следующей таблице описан каждый элемент шаблона поиска. (В следующей таблице используется символ \, который должен быть заменен как \\ в текстовой строке C#).
| Рисунок | Meaning |
|---|---|
the |
совпадает с текстом "the" |
(eir)? |
совпадение с 0 или 1 вхождением "eir" |
\s |
сопоставление символа пробела |
string[] sentences =
[
"Put the water over there.",
"They're quite thirsty.",
"Their water bottles broke."
];
string sPattern = "the(ir)?\\s";
foreach (string s in sentences)
{
Console.Write($"{s,24}");
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
Console.WriteLine($" (match for '{sPattern}' found)");
}
else
{
Console.WriteLine();
}
}
Подсказка
Методы string обычно лучше подходят при поиске точной строки. Регулярные выражения лучше использовать при поиске определенного шаблона в исходной строке.
Соответствует ли строка шаблону?
Следующий код использует регулярные выражения для проверки формата каждой строки в массиве. Проверка требует, чтобы каждая строка отформатирована как номер телефона: три группы цифр, разделенные дефисами, в которых первые две группы содержат три цифры, а третья группа содержит четыре цифры. Шаблон поиска использует регулярное выражение ^\\d{3}-\\d{3}-\\d{4}$. Дополнительные сведения см. в "Язык регулярных выражений — краткий справочник".
| Рисунок | Meaning |
|---|---|
^ |
Соответствует началу строки |
\d{3} |
Соответствует ровно трем цифрам |
- |
Соответствует символу "-" |
\d{4} |
Соответствует ровно четырём цифровым символам. |
$ |
Соответствует концу строки |
string[] numbers =
[
"123-555-0190",
"444-234-22450",
"690-555-0178",
"146-893-232",
"146-555-0122",
"4007-555-0111",
"407-555-0111",
"407-2-5555",
"407-555-8974",
"407-2ab-5555",
"690-555-8148",
"146-893-232-"
];
string sPattern = """^\d{3}-\d{3}-\d{4}$""";
foreach (string s in numbers)
{
Console.Write($"{s,14}");
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
{
Console.WriteLine(" - valid");
}
else
{
Console.WriteLine(" - invalid");
}
}
Этот шаблон поиска соответствует множеству допустимых строк. Регулярные выражения лучше подходят для поиска или проверки соответствия шаблону, чем для работы с одиночной текстовой строкой.