Udostępnij za pośrednictwem


Jak wyszukiwać ciągi

Do wyszukiwania tekstu w ciągach można użyć dwóch głównych strategii. Metody wyszukiwania klasy dla określonego String tekstu. Wyrażenia regularne wyszukują wzorce w tekście.

Uwaga

Przykłady języka C# w tym artykule są uruchamiane w Try.NET wbudowanym modułem uruchamiającym kod i placem zabaw. Wybierz przycisk Uruchom, aby uruchomić przykład w oknie interaktywnym. Po wykonaniu kodu można go zmodyfikować i uruchomić zmodyfikowany kod, wybierając pozycję Uruchom ponownie. Zmodyfikowany kod jest uruchamiany w oknie interaktywnym lub, jeśli kompilacja zakończy się niepowodzeniem, w oknie interaktywnym zostaną wyświetlone wszystkie komunikaty o błędach kompilatora języka C#.

Typ ciągu, który jest aliasem dla System.String klasy, zawiera wiele przydatnych metod wyszukiwania zawartości ciągu. Wśród nich są Contains: , , StartsWithEndsWith, IndexOf, LastIndexOf. Klasa System.Text.RegularExpressions.Regex udostępnia rozbudowane słownictwo do wyszukiwania wzorców w tekście. W tym artykule poznasz te techniki i dowiesz się, jak wybrać najlepszą metodę dla Twoich potrzeb.

Czy ciąg zawiera tekst?

Metody String.Contains, String.StartsWithi String.EndsWith wyszukują ciąg dla określonego tekstu. W poniższym przykładzie przedstawiono każdą z tych metod i odmianę, która używa wyszukiwania bez uwzględniania wielkości liter:

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

W poprzednim przykładzie pokazano ważny punkt użycia tych metod. Wyszukiwanie jest domyślnie uwzględniane w wielkości liter . Wartość wyliczenia służy StringComparison.CurrentCultureIgnoreCase do określania wyszukiwania bez uwzględniania wielkości liter.

Gdzie wyszukiwany tekst występuje w ciągu?

Metody IndexOf i LastIndexOf również wyszukują tekst w ciągach. Metody te zwracają lokalizację szukanego tekstu. Jeśli tekst nie zostanie znaleziony, zwraca wartość -1. W poniższym przykładzie pokazano wyszukiwanie pierwszego i ostatniego wystąpienia słowa "methods" i wyświetla tekst między nimi.

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

Znajdowanie określonego tekstu przy użyciu wyrażeń regularnych

Klasa System.Text.RegularExpressions.Regex może służyć do wyszukiwania ciągów. Te wyszukiwania mogą obejmować złożoność od prostych do skomplikowanych wzorców tekstu.

Poniższy przykład kodu wyszukuje słowo "the" lub "ich" w zdaniu, ignorując przypadek. Metoda Regex.IsMatch statyczna wykonuje wyszukiwanie. Możesz nadać mu ciąg do wyszukiwania i wzorca wyszukiwania. W tym przypadku trzeci argument określa wyszukiwanie bez uwzględniania wielkości liter. Aby uzyskać więcej informacji, zobacz System.Text.RegularExpressions.RegexOptions.

Wzorzec wyszukiwania opisuje wyszukiwany tekst. W poniższej tabeli opisano każdy element wzorca wyszukiwania. (W poniższej tabeli użyto pojedynczego \elementu , który musi zostać usunięty jako \\ w ciągu języka C#).

Wzorzec Znaczenie
the dopasuj tekst "the"
(eir)? dopasowanie 0 lub 1 wystąpienia "eir"
\s dopasowywuje znak odstępu
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();
    }
}

Napiwek

Metody string są zwykle lepszymi wyborami podczas wyszukiwania dokładnego ciągu. Wyrażenia regularne są lepsze, gdy szukasz wzorca w ciągu źródłowym.

Czy ciąg jest zgodne ze wzorcem?

Poniższy kod używa wyrażeń regularnych do sprawdzania poprawności formatu każdego ciągu w tablicy. Weryfikacja wymaga, aby każdy ciąg miał postać numeru telefonu, w którym trzy grupy cyfr są oddzielone kreskami, pierwsze dwie grupy zawierają trzy cyfry, a trzecia grupa zawiera cztery cyfry. Wzorzec wyszukiwania używa wyrażenia ^\\d{3}-\\d{3}-\\d{4}$regularnego . Aby uzyskać więcej informacji, zobacz Język wyrażeń regularnych — szybka dokumentacja.

Wzorzec Znaczenie
^ dopasuje początek ciągu
\d{3} dopasowyuje dokładnie 3 cyfry
- pasuje do znaku "-"
\d{4} dopasowyuje dokładnie 4 cyfry
$ pasuje do końca ciągu
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");
    }
}

Ten pojedynczy wzorzec wyszukiwania pasuje do wielu prawidłowych ciągów. Wyrażenia regularne lepiej wyszukiwać lub weryfikować względem wzorca, a nie pojedynczego ciągu tekstowego.

Zobacz też