Partilhar 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 de busca de texto específico. As expressões regulares procuram padrões no texto.

Nota

Os exemplos de C# neste artigo são executados no Try.NET corredor de código embutido e playground. Selecione o botão Executar para executar um exemplo em uma janela interativa. Depois de executar o código, você pode modificá-lo e executar o código modificado selecionando Executar novamente. O código modificado é executado na janela interativa ou, se a compilação falhar, a janela interativa exibe todas as mensagens de erro do compilador C#.

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

Uma cadeia de caracteres contém texto?

Os String.Containsmétodos , String.StartsWithe String.EndsWith pesquisam uma cadeia de caracteres para 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");
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 o uso desses métodos. As pesquisas diferenciam maiúsculas de minúsculas por padrão. Use o valor de enumeração para especificar uma pesquisa que não diferencia maiúsculas StringComparison.CurrentCultureIgnoreCase de minúsculas.

Onde ocorre o texto procurado em uma string?

Os IndexOf métodos e LastIndexOf também procuram 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 para a primeira e a última ocorrência da palavra "métodos" e exibe o texto intermediário.

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, desde padrões de texto simples até complicados.

O exemplo de código a seguir procura a palavra "o" ou "deles" em uma frase, ignorando maiúsculas e minúsculas. 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, veja System.Text.RegularExpressions.RegexOptions.

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

Padrão Significado
the corresponder ao texto "o"
(eir)? correspondência 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();
    }
}

Gorjeta

Os string métodos geralmente são melhores escolhas quando você está procurando por uma cadeia de caracteres exata. As 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 string tenha a forma de um número de telefone no qual três grupos de dígitos são separados por traços, 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 ^\\d{3}-\\d{3}-\\d{4}$regular . Para obter mais informações, consulte Linguagem de expressão regular - referência rápida.

Padrão Significado
^ corresponde ao início da cadeia de caracteres
\d{3} corresponde exatamente a 3 caracteres de dígitos
- corresponde ao caractere '-'
\d{4} corresponde exatamente a 4 caracteres de dígitos
$ 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. As expressões regulares são melhores para procurar ou validar em relação a um padrão, em vez de uma única cadeia de texto.

Consulte também