Sztringek keresése

A sztringekben lévő szöveg kereséséhez két fő stratégiát használhat. A String osztály metódusai specifikus szöveget keresnek. A reguláris kifejezések mintákat keresnek a szövegben.

A sztringtípus , amely az System.String osztály aliasa, számos hasznos módszert kínál a sztring tartalmának kereséséhez. Köztük van Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. Az System.Text.RegularExpressions.Regex osztály gazdag szókincset biztosít a minták kereséséhez a szövegben. Ebben a cikkben megismerheti ezeket a technikákat, és hogyan választhatja ki az igényeinek leginkább megfelelő módszert.

Tartalmaz-e egy karakterlánc szöveget?

A String.Contains, String.StartsWithés String.EndsWith metódusok egy adott szövegre keresnek sztringet. Az alábbi példa az egyes metódusokat és a kis- és nagybetűkre nem érzékeny keresést használó változatot mutatja be.

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");
// Raw string literals can work here because the output doesn't begin with "
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}");

Az előző példa egy fontos pontot mutat be ezeknek a módszereknek a használatához. A keresések alapértelmezés szerint megkülönböztetik a kis- és nagybetűket. Az StringComparison.CurrentCultureIgnoreCase enumerálási érték használatával megadhat egy kis- és nagybetűket nem érzékenyítő keresést.

Hol fordul elő a keresett szöveg egy sztringben?

A IndexOf és LastIndexOf metódusok sztringekben is keresnek szöveget. Ezek a metódusok visszaadják a keresett szöveg helyét. Ha a szöveg nem található, a rendszer visszaadja -1. Az alábbi példa bemutatja a "módszerek" szó első és utolsó előfordulásának keresését, és megjeleníti a közöttük lévő szöveget.

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

Adott szöveg keresése reguláris kifejezések használatával

Az System.Text.RegularExpressions.Regex osztály sztringek keresésére használható. Ezek a keresések összetettek lehetnek az egyszerűtől a bonyolult szövegmintákig.

Az alábbi példakód a "the" vagy a "their" szót keresi egy mondatban, figyelmen kívül hagyva az esetet. A statikus metódus Regex.IsMatch végrehajtja a keresést. Megadod a kereséshez a karakterláncot és a keresési mintát. Ebben az esetben egy harmadik argumentum határozza meg a kis- és nagybetűk közötti érzéketlen keresést. További információért lásd System.Text.RegularExpressions.RegexOptions.

A keresési minta a keresett szöveget írja le. Az alábbi táblázat a keresési minta minden elemét ismerteti. (Az alábbi táblázat az egyetlent \használja, amelyet c# sztringben kell \\ megszűrni.

Pattern Meaning
the keresse meg a "the" szót
(eir)? az "eir" 0 vagy 1 előfordulásának egyezése
\s szóköz karakter egyeztetése
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();
    }
}

Jótanács

A string metódusok általában jobb választásnak számítanak, ha pontos sztringet keres. A reguláris kifejezések akkor jobbak, ha valamilyen mintát keres egy forrássztringben.

Követ egy karakterlánc mintát?

Az alábbi kód normál kifejezéseket használ a tömb egyes sztringjeinek formátumának ellenőrzéséhez. Az ellenőrzéshez minden sztringet telefonszámként kell formázni: három számjegycsoportot szaggatott vonallal elválasztva, ahol az első két csoport három számjegyet tartalmaz, a harmadik csoport pedig négy számjegyet. A keresési minta a reguláris kifejezést ^\\d{3}-\\d{3}-\\d{4}$használja. További információ: Regular Expression Language – Quick Reference.

Pattern Meaning
^ A szöveg elejével egyezés
\d{3} Pontosan három számjegy karakterének egyezése
- Megegyezik a "-" karakterével
\d{4} Pontosan négy számjegy karakterének felel meg
$ Megfelel a karakterlánc végének
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");
    }
}

Ez az egyetlen keresési minta számos érvényes sztringnek felel meg. A reguláris kifejezések jobbak minták keresésére vagy érvényesítésére, mint egy szöveges karakterlánc esetén.

Lásd még