Share via


Dizeleri arama

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

Not

Bu makaledeki C# örnekleri Try.NET satır içi kod çalıştırıcısında ve oyun alanında çalıştırılır. Etkileşimli bir pencerede örnek çalıştırmak için Çalıştır düğmesini seçin. Kodu yürüttkten sonra yeniden Çalıştır'ı seçerek kodu değiştirebilir ve değiştirilen kodu çalıştırabilirsiniz. Değiştirilen kod etkileşimli pencerede çalışır veya derleme başarısız olursa, etkileşimli pencerede tüm C# derleyicisi hata iletileri görüntülenir.

sınıfı için System.String bir diğer ad olan dize türü, bir dizenin içeriğini aramak için bir dizi 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");
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, döndürür -1. 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 yok sayar. 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# dizesinde olduğu gibi \\ kaçış karakterine sahip olması gereken tek \bir kullanılır).

Desen Anlamı
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();
    }
}

İpucu

Yöntemler string genellikle tam bir dize ararken 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 üç basamak grubunun tirelerle ayrıldığı, ilk iki grubun üç basamak içerdiği ve üçüncü grubun dört basamak içerdiği bir telefon numarası biçiminde olmasını gerektirir. 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 Anlamı
^ dizenin başlangıcıyla eşleşir
\d{3} tam olarak 3 basamaklı karakterlerle eşleşir
- '-' karakteriyle eşleşir
\d{4} tam olarak 4 basamaklı karakterlerle 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 bkz.