Compartilhar via


Como pesquisar cadeias de caracteres

Você pode usar duas estratégias principais para pesquisar texto em cadeias de caracteres. Métodos da String classe pesquisam texto específico. Expressões regulares pesquisam padrões no texto.

O tipo de cadeia de caracteres, que é um alias para a System.String classe, fornece muitos métodos úteis para pesquisar o conteúdo de uma cadeia de caracteres. Entre eles estão Contains, StartsWith, , EndsWith, IndexOf, LastIndexOf. A System.Text.RegularExpressions.Regex classe fornece um vocabulário avançado para pesquisar padrões no texto. Neste artigo, você aprenderá essas técnicas e como escolher o melhor método para suas necessidades.

Uma cadeia de caracteres contém texto?

Os String.Containsmétodos e String.StartsWith os String.EndsWithmétodos pesquisam uma cadeia de caracteres em busca de texto específico. O exemplo a seguir mostra cada um desses métodos e uma variação que usa uma pesquisa que não diferencia maiúsculas de minúsculas:

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}");

O exemplo anterior demonstra um ponto importante para usar esses métodos. As pesquisas são sensíveis a maiúsculas e minúsculas por padrão. Use o valor de enumeração StringComparison.CurrentCultureIgnoreCase para especificar uma pesquisa sem distinção entre maiúsculas e minúsculas.

Onde o texto procurado ocorre em uma cadeia de caracteres?

Os IndexOf métodos e os LastIndexOf métodos também pesquisam texto em cadeias de caracteres. Esses métodos retornam o local do texto que está sendo procurado. Se o texto não for encontrado, eles retornarão -1. O exemplo a seguir mostra uma pesquisa pela primeira e última ocorrência da palavra "métodos" e exibe o texto no meio.

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}'""");

Localizando texto específico usando expressões regulares

A System.Text.RegularExpressions.Regex classe pode ser usada para pesquisar cadeias de caracteres. Essas pesquisas podem variar em complexidade de padrões de texto simples a complicados.

O exemplo de código a seguir pesquisa a palavra "o" ou "deles" em uma frase, ignorando o caso. O método Regex.IsMatch estático executa a pesquisa. Você dá a ele a cadeia de caracteres para pesquisar e um padrão de pesquisa. Nesse caso, um terceiro argumento especifica a pesquisa que não diferencia maiúsculas de minúsculas. Para obter mais informações, consulte System.Text.RegularExpressions.RegexOptions.

O padrão de pesquisa descreve o texto que você procura. A tabela a seguir descreve cada elemento do padrão de pesquisa. (A tabela a seguir usa o único \, que deve ser escapado como \\ em uma cadeia de caracteres C#).

Padrão Meaning
the corresponder ao texto "the"
(eir)? corresponder 0 ou 1 ocorrência de "eir"
\s corresponder a um caractere de espaço em branco
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();
    }
}

Dica

Os string métodos geralmente são melhores opções quando você está procurando uma cadeia de caracteres exata. Expressões regulares são melhores quando você está procurando por algum padrão em uma cadeia de caracteres de origem.

Uma cadeia de caracteres segue um padrão?

O código a seguir usa expressões regulares para validar o formato de cada cadeia de caracteres em uma matriz. A validação requer que cada cadeia de caracteres seja formatada como um número de telefone: três grupos de dígitos separados por traços em que os dois primeiros grupos contêm três dígitos e o terceiro grupo contém quatro dígitos. O padrão de pesquisa usa a expressão regular ^\\d{3}-\\d{3}-\\d{4}$. Para obter mais informações, consulte Linguagem de Expressão Regular – Referência Rápida.

Padrão Meaning
^ corresponde ao início da cadeia de caracteres
\d{3} corresponde a exatamente três dígitos de caracteres
- corresponde ao caractere '-'
\d{4} corresponde a exatamente quatro caracteres de dígito
$ corresponde ao final da cadeia de caracteres
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");
    }
}

Esse único padrão de pesquisa corresponde a muitas cadeias de caracteres válidas. Expressões regulares são melhores para pesquisar ou validar em relação a um padrão, em vez de uma única cadeia de caracteres de texto.

Consulte também