Delen via


Tekenreeksen zoeken

U kunt twee hoofdstrategieën gebruiken om te zoeken naar tekst in tekenreeksen. Methoden van de String klasse zoeken naar specifieke tekst. Reguliere expressies zoeken naar patronen in tekst.

Notitie

De C#-voorbeelden in dit artikel worden uitgevoerd in de Try.NET inline coderunner en playground. Selecteer de knop Uitvoeren om een voorbeeld uit te voeren in een interactief venster. Nadat u de code hebt uitgevoerd, kunt u deze wijzigen en de gewijzigde code uitvoeren door Opnieuw uitvoeren te selecteren. De gewijzigde code wordt uitgevoerd in het interactieve venster of, als de compilatie mislukt, worden alle C#-compilerfoutberichten weergegeven.

Het tekenreekstype , een alias voor de System.String klasse, biedt een aantal nuttige methoden voor het doorzoeken van de inhoud van een tekenreeks. Onder hen zijnContains, StartsWith, , EndsWith, , IndexOf. LastIndexOf De System.Text.RegularExpressions.Regex klas biedt een uitgebreide woordenlijst om te zoeken naar patronen in tekst. In dit artikel leert u deze technieken en hoe u de beste methode voor uw behoeften kiest.

Bevat een tekenreeks tekst?

De String.Contains, String.StartsWithen String.EndsWith methoden zoeken een tekenreeks naar specifieke tekst. In het volgende voorbeeld ziet u elk van deze methoden en een variatie die gebruikmaakt van een hoofdlettergevoelige zoekopdracht:

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

In het voorgaande voorbeeld ziet u een belangrijk punt voor het gebruik van deze methoden. Zoekopdrachten zijn standaard hoofdlettergevoelig . U gebruikt de StringComparison.CurrentCultureIgnoreCase opsommingswaarde om een hoofdlettergevoelige zoekopdracht op te geven.

Waar vindt de gezochte tekst plaats in een tekenreeks?

De IndexOf en LastIndexOf methoden zoeken ook naar tekst in tekenreeksen. Deze methoden retourneren de locatie van de tekst die wordt gezocht. Als de tekst niet wordt gevonden, worden ze geretourneerd -1. In het volgende voorbeeld ziet u een zoekopdracht naar het eerste en laatste exemplaar van het woord 'methoden' en wordt de tekst ertussen weergegeven.

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

Specifieke tekst zoeken met behulp van reguliere expressies

De System.Text.RegularExpressions.Regex klasse kan worden gebruikt om tekenreeksen te zoeken. Deze zoekopdrachten kunnen variëren in complexiteit van eenvoudige tot gecompliceerde tekstpatronen.

In het volgende codevoorbeeld wordt gezocht naar het woord 'the' of 'their' in een zin, waarbij hoofdletters en kleine letters worden genegeerd. De statische methode Regex.IsMatch voert de zoekopdracht uit. U geeft deze de tekenreeks om te zoeken en een zoekpatroon. In dit geval geeft een derde argument een niet-hoofdlettergevoelige zoekopdracht aan. Zie System.Text.RegularExpressions.RegexOptions voor meer informatie.

Het zoekpatroon beschrijft de tekst die u zoekt. In de volgende tabel wordt elk element van het zoekpatroon beschreven. (In de onderstaande tabel wordt de enkele \tabel gebruikt, die moet worden ontsnapt als \\ in een C#-tekenreeks).

Patroon Betekenis
the komt overeen met de tekst 'the'
(eir)? overeenkomen met 0 of 1 exemplaar van 'eir'
\s overeenkomen met een spatieteken
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();
    }
}

Tip

De string methoden zijn meestal betere keuzes wanneer u zoekt naar een exacte tekenreeks. Reguliere expressies zijn beter wanneer u zoekt naar een bepaald patroon in een brontekenreeks.

Volgt een tekenreeks een patroon?

In de volgende code worden reguliere expressies gebruikt om de indeling van elke tekenreeks in een matrix te valideren. Voor de validatie moet elke tekenreeks de vorm hebben van een telefoonnummer waarin drie groepen cijfers worden gescheiden door streepjes, de eerste twee groepen drie cijfers bevatten en de derde groep vier cijfers bevat. Het zoekpatroon maakt gebruik van de reguliere expressie ^\\d{3}-\\d{3}-\\d{4}$. Zie Reguliere expressietaal - Snelzoekgids voor meer informatie.

Patroon Betekenis
^ komt overeen met het begin van de tekenreeks
\d{3} komt overeen met exact 3 cijfers
- komt overeen met het teken '-'
\d{4} komt overeen met exact 4 cijfers
$ komt overeen met het einde van de tekenreeks
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");
    }
}

Dit enkele zoekpatroon komt overeen met veel geldige tekenreeksen. Reguliere expressies zijn beter om te zoeken naar of te valideren op basis van een patroon, in plaats van één tekenreeks.

Zie ook