Como pesquisar strings

Pode usar duas estratégias principais para procurar texto em cadeias de texto. Métodos da String classe procuram por texto específico. Expressões regulares procuram padrões no texto.

O tipo de cadeia , que é um alias para a System.String classe, fornece muitos métodos úteis para pesquisar o conteúdo de uma cadeia. Entre elas estão Contains, StartsWith, EndsWith, IndexOf, . LastIndexOf A System.Text.RegularExpressions.Regex classe oferece um vocabulário rico para procurar padrões em texto. Neste artigo, aprende estas técnicas e como escolher o melhor método para as suas necessidades.

Uma cadeia contém texto?

Os String.Containsmétodos , String.StartsWith, e String.EndsWith pesquisam uma cadeia de caracteres por texto específico. O exemplo seguinte mostra cada um destes métodos e uma variação, que utiliza uma pesquisa insensível a maiú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 a utilização destes métodos. As pesquisas são sensíveis a maiúsculas minúsculas por defeito. Utiliza-se o StringComparison.CurrentCultureIgnoreCase valor de enumeração para especificar uma pesquisa sem distinção entre maiúsculas e minúsculas.

Onde ocorre o texto procurado numa sequência?

Os IndexOf métodos e LastIndexOf também procuram texto em strings. Estes métodos devolvem a localização do texto procurado. Se o texto não for encontrado, eles retornam -1. O exemplo seguinte mostra uma pesquisa pela primeira e última ocorrência da palavra "métodos" e mostra o texto intermédio.

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

Encontrar texto específico usando expressões regulares

A System.Text.RegularExpressions.Regex classe pode ser usada para pesquisar strings. Estas pesquisas podem variar em complexidade desde padrões de texto simples até complexos.

O exemplo de código seguinte procura por as palavras "the" ou "their" numa frase, ignorando as maiúsculas e minúsculas. O método Regex.IsMatch estático realiza a pesquisa. Forneces uma cadeia de caracteres para pesquisar e um padrão de pesquisa. Neste caso, um terceiro argumento indica a busca insensível a maiúsculas. Para obter mais informações, consulte System.Text.RegularExpressions.RegexOptions.

O padrão de pesquisa descreve o texto que procura. A tabela seguinte descreve cada elemento do padrão de pesquisa. (A tabela seguinte utiliza o único \, que deve ser escapado como \\ numa string C#).

Padrão Meaning
the Corresponde ao texto "the"
(eir)? Corresponder a 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();
    }
}

Sugestão

Os string métodos são geralmente melhores escolhas quando procuras uma sequência exata. Expressões regulares são melhores quando procuras algum padrão numa cadeia de origem.

Uma corda segue um padrão?

O código seguinte utiliza expressões regulares para validar o formato de cada string num array. A validação exige que cada cadeia seja formatada como um número de telefone: três grupos de dígitos separados por traços, onde os dois primeiros contêm três dígitos e o terceiro grupo contém quatro dígitos. O padrão de pesquisa utiliza 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 exatamente a caracteres de três dígitos
- Corresponde ao carácter '-'
\d{4} Corresponde exatamente a caracteres de quatro dígitos
$ Coincide com o 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");
    }
}

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

Consulte também