Cadeias de caracteres de pesquisa em C#

Sugestão

Este artigo faz parte da secção Fundamentos para programadores que já conhecem pelo menos uma linguagem de programação e estão a aprender C#. Se és novo na programação, começa primeiro pelos tutoriais para começar .

Vem de outra língua? Os métodos string de C#, como Contains, StartsWith e IndexOf, têm equivalentes em Java no String e em JavaScript no String.prototype. A principal diferença é que algumas pesquisas em C# utilizam por predefinição a comparação ordinal, sensível a maiúsculas e minúsculas. Outros adotam, por predefinição, a semântica da configuração regional atual. Para pesquisas direcionadas ao utilizador, pode querer passar um StringComparison valor.

A String aula inclui métodos que respondem a duas perguntas do dia a dia:

Algoritmos de pesquisa e substituição mais complexos podem ser construídos usando expressões regulares. Para mais informações sobre expressões regulares e outras operações de string, consulte o artigo de referência de linguagem sobre Operações de string.

Verifica se uma cadeia contém texto

Use Contains, StartsWith, ou EndsWith para testar a presença de uma substring:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");

// Default comparisons are case sensitive.
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"""Contains "extension"? {containsSearchResult}""");

// For user-facing searches, pass a StringComparison value to control case and culture.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"""Starts with "extension"? {ignoreCaseSearchResult} (ignoring case)""");

bool endsWithSearchResult = factMessage.EndsWith(".", StringComparison.Ordinal);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");
// => "Extension methods have all the capabilities of regular static methods."
// => Contains "extension"? False
// => Starts with "extension"? True (ignoring case)
// => Ends with '.'? True

Estes métodos utilizam, por predefinição, a comparação ordinal, sensível a maiúsculas e minúsculas. Para aceitar a entrada do utilizador ou para ignorar a distinção entre maiúsculas e minúsculas no texto apresentado, passe um valor StringComparison, como StringComparison.CurrentCultureIgnoreCase ou StringComparison.OrdinalIgnoreCase.

Quando procurar um único carácter, utilize a sobrecarga char de Contains. Evita a alocação de uma sequência de um carácter e é mais direto:

string path = "/usr/local/bin";
bool hasSlash = path.Contains('/');
Console.WriteLine($"Path contains '/': {hasSlash}");
// => Path contains '/': True

Localizar a posição do texto

IndexOf devolve o índice baseado em zero da primeira ocorrência de uma subcadeia (ou carácter) e LastIndexOf devolve o índice da última ocorrência. Ambos devolvem -1 quando o texto de pesquisa não está presente. Combine-os para extrair o texto entre dois marcadores:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

Console.WriteLine($"\"{factMessage}\"");

// Extract the text between the first and last occurrence of "methods".
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string between = factMessage.Substring(first, last - first);
Console.WriteLine($"""Substring between "methods" and "methods": '{between}'""");
// => "Extension methods have all the capabilities of regular static methods."
// => Substring between "methods" and "methods": ' have all the capabilities of regular static '

Quando precisar de cada ocorrência em vez da primeira ou da última, itere passando o resultado anterior mais um como argumento startIndex, ou mude para uma expressão regular.

Escolha a comparação certa

A maioria das sobrecargas de pesquisa aceita um valor opcional StringComparison . Escolha com base no tipo de dados que está a pesquisar:

  • Se estiver a pesquisar identificadores, caminhos de ficheiros, tokens de protocolo ou qualquer outra coisa definida pela máquina, use Ordinal.
  • Se estiver a pesquisar o mesmo tipo de dados definidos pela máquina mas quiser insensibilidade a maiúsculas minúsculas, use OrdinalIgnoreCase.
  • Se estiver a pesquisar texto visível ao utilizador onde as regras da localização atual devem aplicar-se, use CurrentCulture.
  • Se estiver a pesquisar esse mesmo texto visível ao utilizador e quiser ignorar o caso, use CurrentCultureIgnoreCase.
  • Se estiver a pesquisar em dados persistidos que têm de ser comparados da mesma forma em qualquer máquina e cultura, use InvariantCulture (raramente é necessário).

A comparação de ordinais é a opção mais rápida e o padrão certo para tudo o que não seja texto em linguagem natural. A comparação consciente da cultura é significativamente mais lenta e pode produzir resultados surpreendentes. Por exemplo, em algumas culturas, as minúsculas i não correspondem a maiúsculas I. Utilize-o apenas nas pesquisas que os utilizadores efetuam em texto corrido.

Para uma abordagem aprofundada da comparação sensível à cultura, consulte Melhores práticas para comparar cadeias de caracteres.

Ver também