Бөлісу құралы:


Как искать строки

Для поиска текста в строках можно использовать две основные стратегии. Методы класса 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");
    }
}

Этот шаблон поиска соответствует множеству допустимых строк. Регулярные выражения лучше подходят для поиска или проверки соответствия шаблону, чем для работы с одиночной текстовой строкой.

См. также