Megosztás a következőn keresztül:


Sztringek keresése

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

Feljegyzés

A cikkben szereplő C#-példák a Try.NET beágyazott kódfuttatóban és játszótéren futnak. Kattintson a Futtatás gombra egy példa interaktív ablakban való futtatásához. Miután végrehajtotta a kódot, módosíthatja és futtathatja a módosított kódot a Futtatás gombra kattintva. A módosított kód vagy az interaktív ablakban fut, vagy ha a fordítás sikertelen, az interaktív ablakban megjelenik az összes C#-fordító hibaüzenet.

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 vanContains, StartsWith, , EndsWith, LastIndexOfIndexOf. 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 szöveget egy sztring?

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űket érzéketlen kereséseket használó változatokat 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");
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 enumerálási érték használatával StringComparison.CurrentCultureIgnoreCase adhat meg kis- és nagybetűket nem érzékelyítő keresést.

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

A IndexOf metódusok sztringekben LastIndexOf 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 -1a következőt: Az alábbi példa a "metódusok" szó első és utolsó előfordulásának keresését mutatja be, és a szöveg között jelenik meg.

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. Megadja a kereséshez a sztringet és a keresési mintát. Ebben az esetben egy harmadik argumentum határozza meg a kis- és nagybetűk érzéketlen keresését. További információ: 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.

Minta Értelmezés
the a "the" szövegnek megfelelő
(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();
    }
}

Tipp.

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 sztring egy 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és megköveteli, hogy minden sztring olyan telefonszám legyen, amelyben három számjegycsoportot kötőjelek választanak el, az első két csoport három számjegyet, a harmadik csoport pedig négy számjegyet tartalmaz. 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.

Minta Értelmezés
^ a sztring elejére illeszkedik
\d{3} pontosan 3 jegyű karakternek felel meg
- egyezik a '-' karakter
\d{4} pontosan 4 jegyű karakternek felel meg
$ megfelel a sztring 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, ha egyetlen szöveges sztring helyett mintát keresnek vagy érvényesítenek.

Lásd még