Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wskazówka
Ten artykuł jest częścią sekcji Podstawy dla deweloperów, którzy już znają co najmniej jeden język programowania i uczą się języka C#. Jeśli dopiero zaczynasz programować, najpierw zacznij od samouczków Wprowadzenie .
Pochodzi z innego języka? Metody C# string, takie jak Contains, StartsWith i IndexOf, mają swoje odpowiedniki w języku Java String i JavaScript String.prototype. Kluczowa różnica polega na tym, że niektóre wyszukiwania w języku C# domyślnie używają porównania porządkowego z uwzględnieniem wielkości liter. Inne domyślnie używają semantyki bieżącej kultury. W przypadku wyszukiwań widocznych dla użytkownika warto przekazać wartość StringComparison.
Klasa String zawiera metody, które odpowiadają na dwa codzienne pytania:
- Czy ten ciąg zawiera ten tekst? — użyj Contains, StartsWith, lub EndsWith.
- Gdzie występuje ten tekst? — użyj IndexOf lub LastIndexOf.
Bardziej złożone algorytmy wyszukiwania i zastępowania można tworzyć przy użyciu wyrażeń regularnych. Aby uzyskać więcej informacji na temat wyrażeń regularnych i innych operacji na ciągach, zobacz artykuł w dokumentacji języka dotyczący Operacji na ciągach.
Sprawdzanie, czy ciąg zawiera tekst
Użyj Contains, StartsWith lub EndsWith, aby sprawdzić obecność podciągu:
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
Te metody domyślnie używają porównania porządkowego z rozróżnianiem wielkości liter. Aby zaakceptować dane wejściowe użytkownika lub zignorować przypadek wyświetlania StringComparison tekstu, przekaż wartość taką jak StringComparison.CurrentCultureIgnoreCase lub StringComparison.OrdinalIgnoreCase.
Podczas wyszukiwania pojedynczego znaku użyj przeciążenia char metody Contains. Unika przydzielania ciągu jednoznakowego i jest bardziej bezpośredni:
string path = "/usr/local/bin";
bool hasSlash = path.Contains('/');
Console.WriteLine($"Path contains '/': {hasSlash}");
// => Path contains '/': True
Lokalizowanie położenia tekstu
IndexOf Zwraca indeks zerowy pierwszego wystąpienia podciągu (lub znaku) i LastIndexOf zwraca indeks ostatniego wystąpienia. Oba zwracają -1, gdy szukany tekst nie jest obecny. Połącz je, aby wyodrębnić tekst między dwoma znacznikami:
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 '
Jeśli potrzebujesz każdego wystąpienia, a nie pierwszego lub ostatniego, iteruj przez przekazanie poprzedniego wyniku plus jeden jako startIndex argument lub przełącz się do wyrażenia regularnego.
Wybieranie odpowiedniego porównania
Większość przeciążeń wyszukiwania akceptuje wartość opcjonalną StringComparison . Wybierz je na podstawie rodzaju wyszukiwanych danych:
- Jeśli wyszukujesz identyfikatory, ścieżki plików, tokeny protokołu lub cokolwiek innego zdefiniowanego przez maszynę, użyj polecenia Ordinal.
- Jeśli szukasz tego samego rodzaju danych zdefiniowanych maszynowo, ale chcesz ignorować wielkość liter, użyj OrdinalIgnoreCase.
- Jeśli wyszukujesz tekst widoczny dla użytkownika, w którym powinny być stosowane reguły bieżących ustawień regionalnych, użyj polecenia CurrentCulture.
- Jeśli wyszukujesz ten sam tekst widoczny dla użytkownika i chcesz zignorować przypadek, użyj polecenia CurrentCultureIgnoreCase.
- Jeśli przeszukujesz trwale zapisane dane, które muszą dawać ten sam wynik porównania na wszystkich komputerach i we wszystkich ustawieniach regionalnych, użyj InvariantCulture (rzadko jest to potrzebne).
Porównanie porządkowe jest najszybszą opcją i właściwym domyślnym wyborem dla wszystkiego, co nie jest tekstem w języku naturalnym. Porównanie z uwzględnieniem kultury jest znacznie wolniejsze i może generować zaskakujące wyniki. Na przykład w niektórych kulturach małe litery i nie są zgodne z wielką literą I. Zarezerwuj je dla wyszukiwań, które użytkownicy wykonują względem prozy.
Aby zapoznać się ze szczegółowym traktowaniem porównania z uwzględnieniem kultury, zobacz Najlepsze rozwiązania dotyczące porównywania ciągów.