Så här söker du efter strängar
Du kan använda två huvudsakliga strategier för att söka efter text i strängar. Metoder för String klassen söker efter specifik text. Reguljära uttryck söker efter mönster i text.
Kommentar
C#-exemplen i den här artikeln körs i Try.NET infogad kodlöpare och lekplats. Välj knappen Kör för att köra ett exempel i ett interaktivt fönster. När du har kört koden kan du ändra den och köra den ändrade koden genom att välja Kör igen. Den ändrade koden körs antingen i det interaktiva fönstret eller, om kompilering misslyckas, visar det interaktiva fönstret alla felmeddelanden för C#-kompilatorn.
Strängtypen, som är ett alias för System.String klassen, innehåller ett antal användbara metoder för att söka i innehållet i en sträng. Bland dem finns Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. Klassen System.Text.RegularExpressions.Regex innehåller ett omfattande ordförråd för att söka efter mönster i text. I den här artikeln lär du dig dessa tekniker och hur du väljer den bästa metoden för dina behov.
Innehåller en sträng text?
Metoderna String.Contains, String.StartsWithoch String.EndsWith söker efter en sträng efter specifik text. I följande exempel visas var och en av dessa metoder och en variant som använder en skiftlägesokänslig sökning:
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}");
Föregående exempel visar en viktig punkt för att använda dessa metoder. Sökningar är skiftlägeskänsliga som standard. Du använder StringComparison.CurrentCultureIgnoreCase uppräkningsvärdet för att ange en skiftlägeskänslig sökning.
Var sker den sökta texten i en sträng?
Metoderna IndexOf och LastIndexOf söker också efter text i strängar. Dessa metoder returnerar platsen för texten som söks. Om texten inte hittas returnerar -1
de . I följande exempel visas en sökning efter den första och sista förekomsten av ordet "metoder" och texten visas däremellan.
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}'");
Hitta specifik text med reguljära uttryck
Klassen System.Text.RegularExpressions.Regex kan användas för att söka i strängar. Dessa sökningar kan variera i komplexitet från enkla till komplicerade textmönster.
Följande kodexempel söker efter ordet "the" eller "their" i en mening och ignorerar skiftläge. Den statiska metoden Regex.IsMatch utför sökningen. Du ger den strängen för sökning och ett sökmönster. I det här fallet anger ett tredje argument skiftlägesokänslig sökning. Mer information finns i System.Text.RegularExpressions.RegexOptions.
Sökmönstret beskriver den text du söker efter. I följande tabell beskrivs varje element i sökmönstret. (Tabellen nedan använder den enda \
, som måste vara undantagen som \\
i en C#-sträng).
Mönster | Innebörd |
---|---|
the |
matcha texten "the" |
(eir)? |
matcha 0 eller 1 förekomst av "eir" |
\s |
matcha ett blankstegstecken |
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();
}
}
Dricks
Metoderna string
är vanligtvis bättre val när du söker efter en exakt sträng. Reguljära uttryck är bättre när du söker efter ett mönster i en källsträng.
Följer en sträng ett mönster?
Följande kod använder reguljära uttryck för att verifiera formatet för varje sträng i en matris. Verifieringen kräver att varje sträng har formen av ett telefonnummer där tre grupper med siffror avgränsas med bindestreck, de två första grupperna innehåller tre siffror och den tredje gruppen innehåller fyra siffror. Sökmönstret använder det reguljära uttrycket ^\\d{3}-\\d{3}-\\d{4}$
. Mer information finns i Språk för reguljära uttryck – snabbreferens.
Mönster | Innebörd |
---|---|
^ |
matchar början av strängen |
\d{3} |
matchar exakt tresiffriga tecken |
- |
matchar tecknet "-" |
\d{4} |
matchar exakt 4 siffriga tecken |
$ |
matchar slutet av strängen |
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");
}
}
Det här enkla sökmönstret matchar många giltiga strängar. Reguljära uttryck är bättre att söka efter eller validera mot ett mönster i stället för en enda textsträng.