Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Для поиска текста в строках можно использовать две основные стратегии. Методы класса 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");
}
}
Этот шаблон поиска соответствует множеству допустимых строк. Регулярные выражения лучше подходят для поиска или проверки соответствия шаблону, чем для работы с одиночной текстовой строкой.