Como pesquisar cadeias de caracteresHow to: search strings

Você pode usar duas estratégias principais para pesquisar texto em cadeias de caracteres.You can use two main strategies to search for text in strings. Os métodos da classe String pesquisam por um texto específico.Methods of the String class search for specific text. Expressões regulares pesquisam por padrões no texto.Regular expressions search for patterns in text.

Observação

Os exemplos de C# neste artigo são executados no executador de código embutido Try.NET e no playground.The C# examples in this article run in the Try.NET inline code runner and playground. Clique no botão Executar para executar um exemplo em uma janela interativa.Select the Run button to run an example in an interactive window. Ao executar o código, é possível modificá-lo e executar o código modificado clicando em Executar novamente.Once you execute the code, you can modify it and run the modified code by selecting Run again. O código modificado será executado na janela interativa ou, se a compilação falhar, a janela interativa exibirá todos as mensagens de erro do compilador C#.The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

O tipo string, que é um alias para a classe System.String, fornece uma série de métodos úteis para pesquisar o conteúdo de uma cadeia de caracteres.The string type, which is an alias for the System.String class, provides a number of useful methods for searching the contents of a string. Entre elas estão Contains, StartsWith, EndsWith, IndexOf e LastIndexOf.Among them are Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. A classe System.Text.RegularExpressions.Regex fornece um vocabulário avançado para pesquisar por padrões de texto.The System.Text.RegularExpressions.Regex class provides a rich vocabulary to search for patterns in text. Neste artigo, você aprenderá essas técnicas e como escolher o melhor método para suas necessidades.In this article, you learn these techniques and how to choose the best method for your needs.

Uma cadeia de caracteres contém texto?Does a string contain text?

Os métodos String.Contains, String.StartsWith e String.EndsWith pesquisam uma cadeia de caracteres em busca de um texto específico.The String.Contains, String.StartsWith and String.EndsWith methods search a string for specific text. 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:The following example shows each of these methods and a variation that uses a case insensitive search:

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($"Starts with \"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.The preceding example demonstrates an important point for using these methods. As pesquisas de texto diferenciam maiúsculas e minúsculas por padrão.Searches are case-sensitive by default. Você usa o valor de enumeração StringComparison.CurrentCultureIgnoreCase para especificar uma pesquisa que não diferencia maiúsculas de minúsculas.You use the StringComparison.CurrentCultureIgnoreCase enum value to specify a case insensitive search.

Em que local de uma cadeia de caracteres o texto procurado ocorre?Where does the sought text occur in a string?

Os métodos IndexOf e LastIndexOf também pesquisam texto em cadeias de caracteres.The IndexOf and LastIndexOf methods also search for text in strings. Esses métodos retornam o local do texto que está sendo procurado.These methods return the location of the text being sought. Se o texto não for encontrado, elas retornarão -1.If the text isn't found, they return -1. O exemplo a seguir mostra uma pesquisa para a primeira e a última ocorrência da palavra "métodos" e exibe o texto entre elas.The following example shows a search for the first and last occurrence of the word "methods" and displays the text in between.

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

Localizar texto específico usando expressões regularesFinding specific text using regular expressions

A classe System.Text.RegularExpressions.Regex pode ser usada para pesquisar cadeias de caracteres.The System.Text.RegularExpressions.Regex class can be used to search strings. Essas pesquisas podem variar em complexidade, de padrões de texto simples até os complicados.These searches can range in complexity from simple to complicated text patterns.

O exemplo de código a seguir procura a palavra "the" ou "their" em uma oração, sem diferenciar maiúsculas e minúsculas.The following code example searches for the word "the" or "their" in a sentence, ignoring case. O método estático Regex.IsMatch realiza a pesquisa.The static method Regex.IsMatch performs the search. Você fornece a ele a cadeia de caracteres a pesquisar e um padrão de pesquisa.You give it the string to search and a search pattern. Nesse caso, um terceiro argumento especifica que a pesquisa não diferencia maiúsculas de minúsculas.In this case, a third argument specifies case-insensitive search. Para obter mais informações, consulte System.Text.RegularExpressions.RegexOptions.For more information, see System.Text.RegularExpressions.RegexOptions.

O padrão de pesquisa descreve o texto pelo qual procurar.The search pattern describes the text you search for. A tabela a seguir descreve cada elemento desse padrão de pesquisa.The following table describes each element of the search pattern. (A tabela abaixo usa a \ única, que deve ser escapada como \\ em uma cadeia de caracteres C#).(The table below uses the single \ which must be escaped as \\ in a C# string).

padrãopattern SignificadoMeaning
thethe corresponder ao texto "the"match the text "the"
(eir)?(eir)? corresponder a 0 ou 1 ocorrência de "eir"match 0 or 1 occurrence of "eir"
\s\s corresponder a um caractere de espaço em brancomatch a white-space character
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 métodos string são geralmente melhores opções quando você está procurando por uma cadeia de caracteres exata.The string methods are usually better choices when you are searching for an exact string. Expressões regulares são melhores quando você está procurando por algum padrão em uma cadeia de caracteres de origem.Regular expressions are better when you are searching for some pattern is a source string.

Uma cadeia de caracteres segue um padrão?Does a string follow a pattern?

O código a seguir usa expressões regulares para validar o formato de cada cadeia de caracteres em uma matriz.The following code uses regular expressions to validate the format of each string in an array. A validação requer que cada cadeia de caracteres tenha a forma de um número de telefone no qual os 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.The validation requires that each string have the form of a telephone number in which three groups of digits are separated by dashes, the first two groups contain three digits, and the third group contains four digits. O padrão de pesquisa usa a expressão regular ^\\d{3}-\\d{3}-\\d{4}$.The search pattern uses the regular expression ^\\d{3}-\\d{3}-\\d{4}$. Para obter mais informações, consulte Linguagem de expressões regulares – referência rápida.For more information, see Regular Expression Language - Quick Reference.

padrãopattern SignificadoMeaning
^ corresponde ao início da cadeia de caracteresmatches the beginning of the string
\d{3}\d{3} corresponde a exatamente 3 caracteres de dígitosmatches exactly 3 digit characters
- corresponde ao caractere '-'matches the '-' character
\d{3}\d{3} corresponde a exatamente 3 caracteres de dígitosmatches exactly 3 digit characters
- corresponde ao caractere '-'matches the '-' character
\d{4}\d{4} corresponde a exatamente 4 caracteres de dígitosmatches exactly 4 digit characters
$ corresponde ao final da cadeia de caracteresmatches the end of the string
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 padrão de pesquisa único corresponde a várias cadeias de caracteres válidas.This single search pattern matches many valid strings. Expressões regulares são melhores para pesquisar por ou validar mediante um padrão, em vez de uma única cadeia de caracteres de texto.Regular expressions are better to search for or validate against a pattern, rather than a single text string.

Você pode experimentar estes exemplos examinando o código em nosso repositório GitHub.You can try these samples by looking at the code in our GitHub repository. Ou então, você pode baixar os exemplos como um arquivo zip.Or you can download the samples as a zip file.

Consulte tambémSee also