Aracılığıyla paylaş


Dizeleri nasıl arayabilirim

Dizelerdeki metinleri aramak için iki ana strateji kullanabilirsiniz. String sınıfının yöntemleri belirli metinleri arar. Normal ifadeler metindeki desenleri arar.

sınıfı için bir diğer ad olan System.String türü, bir dizenin içeriğini aramak için birçok yararlı yöntem sağlar. Bunların arasında Contains, , StartsWithEndsWith, IndexOf, . LastIndexOf sınıfı, System.Text.RegularExpressions.Regex metindeki desenleri aramak için zengin bir sözlük sağlar. Bu makalede, bu teknikleri ve ihtiyaçlarınız için en iyi yöntemi seçmeyi öğreneceksiniz.

Dize metin içeriyor mu?

String.Contains, String.StartsWithve String.EndsWith yöntemleri belirli bir metin için bir dize arar. Aşağıdaki örnekte bu yöntemlerin her biri ve büyük/küçük harfe duyarsız arama kullanan bir çeşitleme gösterilmektedir:

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

Yukarıdaki örnekte bu yöntemlerin kullanılması için önemli bir nokta gösterilmektedir. Aramalar varsayılan olarak büyük/küçük harfe duyarlıdır . Büyük/küçük harfe StringComparison.CurrentCultureIgnoreCase duyarlı olmayan bir arama belirtmek için numaralandırma değerini kullanırsınız.

Aranan metin bir dizede nerede gerçekleşir?

IndexOf ve LastIndexOf yöntemleri de dizelerdeki metinleri arar. Bu yöntemler, aranan metnin konumunu döndürür. Metin bulunamazsa, onu -1 olarak döndürür. Aşağıdaki örnek, "methods" sözcüğünün ilk ve son oluşumu için bir arama gösterir ve aradaki metni görüntüler.

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

Normal ifadeleri kullanarak belirli metinleri bulma

System.Text.RegularExpressions.Regex sınıfı, dizeleri aramak için kullanılabilir. Bu aramalar karmaşıklıkta basitten karmaşık metin desenlerine kadar değişebilir.

Aşağıdaki kod örneği, bir cümlede "the" veya "their" sözcüğünü arar ve büyük/küçük harf farkını göz ardı eder. Statik yöntem Regex.IsMatch aramayı gerçekleştirir. Arama için dizeyi ve arama desenini verirsiniz. Bu durumda, üçüncü bir bağımsız değişken büyük/küçük harfe duyarsız aramayı belirtir. Daha fazla bilgi için bkz. System.Text.RegularExpressions.RegexOptions.

Arama düzeni, aradığınız metni açıklar. Aşağıdaki tabloda arama deseninin her öğesi açıklanmaktadır. (Aşağıdaki tabloda, C# dizisinde \ kaçış dizisi olarak \\ şeklinde yazılmalıdır).

Desen Meaning
the "the" metnini eşleştirme
(eir)? "eir" örneğinin 0 veya 1 örneğini eşleştir
\s boşluk karakterini eşleştirme
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();
    }
}

Tavsiye

Yöntemler string , tam bir dize ararken genellikle daha iyi seçeneklerdir. Bir kaynak dizede bir desen ararken normal ifadeler daha iyidir.

Bir dize bir deseni izler mi?

Aşağıdaki kod, bir dizideki her dizenin biçimini doğrulamak için normal ifadeleri kullanır. Doğrulama, her dizenin bir telefon numarası olarak biçimlendirilmesini gerektirir: üç basamak grubunun tire ile ayrıldığı, ilk iki grubun üç basamaktan ve üçüncü grubun dört basamaktan oluştuğu bir format. Arama düzeni normal ifadesini ^\\d{3}-\\d{3}-\\d{4}$kullanır. Daha fazla bilgi için bkz. Normal İfade Dili - Hızlı Başvuru.

Desen Meaning
^ Dizenin başlangıcıyla eşleşir
\d{3} Tam olarak üç basamaklı karakterle eşleşir
- '-' karakteriyle eşleşir
\d{4} Tam olarak dört basamaklı karakterle eşleşir
$ Dizenin sonuyla eşleşir
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");
    }
}

Bu tek arama düzeni birçok geçerli dizeyle eşleşir. Normal ifadeler, tek bir metin dizesi yerine bir desen için arama yapmak veya desene göre doğrulamak daha iyidir.

Ayrıca bakınız