Normal İfadelerdeki Değişim Yapıları

Değişim yapıları, normal ifadeyi değiştirerek veya koşullu eşleştirmeyi etkinleştirir. .NET üç değiştirme yapısını destekler:

| ile Desen Eşleştirme

Dikey çubuk (|) karakterini, karakterin her deseni ayırdığı bir dizi desenden herhangi biriyle eşleştirmek | için kullanabilirsiniz.

Pozitif karakter sınıfı gibi, | karakter de bir dizi tek karakterden herhangi birini eşleştirmek için kullanılabilir. Aşağıdaki örnek, bir dizedeki "gray" veya "grey" sözcüklerinin | oluşumlarını bulmak için hem pozitif karakter sınıfı hem de karakterle eşleşen bir desen kullanır. Bu durumda, | karakter daha ayrıntılı bir normal ifade üretir.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      // Regular expression using character class.
      string pattern1 = @"\bgr[ae]y\b";
      // Regular expression using either/or.
      string pattern2 = @"\bgr(a|e)y\b";

      string input = "The gray wolf blended in among the grey rocks.";
      foreach (Match match in Regex.Matches(input, pattern1))
         Console.WriteLine("'{0}' found at position {1}",
                           match.Value, match.Index);
      Console.WriteLine();
      foreach (Match match in Regex.Matches(input, pattern2))
         Console.WriteLine("'{0}' found at position {1}",
                           match.Value, match.Index);
   }
}
// The example displays the following output:
//       'gray' found at position 4
//       'grey' found at position 35
//
//       'gray' found at position 4
//       'grey' found at position 35
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        ' Regular expression using character class.
        Dim pattern1 As String = "\bgr[ae]y\b"
        ' Regular expression using either/or.
        Dim pattern2 As String = "\bgr(a|e)y\b"

        Dim input As String = "The gray wolf blended in among the grey rocks."
        For Each match As Match In Regex.Matches(input, pattern1)
            Console.WriteLine("'{0}' found at position {1}", _
                              match.Value, match.Index)
        Next
        Console.WriteLine()
        For Each match As Match In Regex.Matches(input, pattern2)
            Console.WriteLine("'{0}' found at position {1}", _
                              match.Value, match.Index)
        Next
    End Sub
End Module
' The example displays the following output:
'       'gray' found at position 4
'       'grey' found at position 35
'       
'       'gray' found at position 4
'       'grey' found at position 35           

karakterini kullanan | normal ifade, \bgr(a|e)y\başağıdaki tabloda gösterildiği gibi yorumlanır:

Desen Açıklama
\b Bir sözcük sınırında başla.
gr "gr" karakterlerini eşleştirin.
(a|e) Bir "a" veya "e" ile eşleş.
y\b Sözcük sınırındaki bir "y" ile eşleşir.

Karakter | , karakter değişmez değerleri ve normal ifade dili öğelerinin herhangi bir bileşimini içerebilen birden çok karakter veya alt ifade ile eşleştirme gerçekleştirmek için de kullanılabilir. (Karakter sınıfı bu işlevselliği sağlamaz.) Aşağıdaki örnekte, d dd d biçiminde 9 basamaklı bir sayı olan ABD Sosyal Güvenlik Numarası (SSN) veya dd dd-- biçiminde 9 basamaklı bir sayı -olan ABD İşveren Kimlik Numarası (EIN) ayıklamak için karakteri kullanılır.|

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example displays the following output:
//       Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim pattern As String = "\b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
        Dim input As String = "01-9999999 020-333333 777-88-9999"
        Console.WriteLine("Matches for {0}:", pattern)
        For Each match As Match In Regex.Matches(input, pattern)
            Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
        Next
    End Sub
End Module
' The example displays the following output:
'       Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
'          01-9999999 at position 0
'          777-88-9999 at position 22

Normal ifade \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b aşağıdaki tabloda gösterildiği gibi yorumlanır:

Desen Açıklama
\b Bir sözcük sınırında başla.
(\d{2}-\d{7}|\d{3}-\d{2}-\d{4}) Aşağıdakilerden birini eşleştirin: iki ondalık basamak ve ardından bir kısa çizgi ve yedi ondalık basamak; veya üç ondalık basamak, kısa çizgi, iki ondalık basamak, başka bir kısa çizgi ve dört ondalık basamak.
\b Eşlemeyi bir sözcük sınırında sonlandır.

İfadeyle koşullu eşleştirme

Bu dil öğesi, ilk desenle eşleşip eşleşmediğine bağlı olarak iki desenden birini eşleştirmeyi dener. Söz dizimi şöyledir:

(?(ifade)evet)

veya

(?(ifade)evet|hayır)

burada ifade eşleştirilen ilk desendir; evet, ifade eşleştirilirse eşleşecek desendir ve ifade eşleşmezse eşleşmek için isteğe bağlı desen hayır olur (desen sağlanmazsa, boş bir hayır ile eşdeğerdir). Normal ifade altyapısı ifadeyi sıfır genişlikli onay olarak değerlendirir; yani normal ifade altyapısı, ifadeyi değerlendirdikten sonra giriş akışında ilerlemez. Bu nedenle, bu yapı aşağıdakiyle eşdeğerdir:

(?(?=ifade)evet|hayır)

burada (?=ifadesi) sıfır genişlikli bir onay yapısıdır. (Daha fazla bilgi için bkz.Gruplandırma Yapıları.) Normal ifade altyapısı ifadeyi bir yer işareti (sıfır genişlikli onay) olarak yorumladığı için, ifade sıfır genişlikli onay (daha fazla bilgi için bkz. Tutturucular) veya aynı zamanda evet içinde yer alan bir alt ifade olmalıdır. Aksi takdirde, evet deseni eşleştirilemez.

Not

İfade adlandırılmış veya numaralandırılmış bir yakalama grubuysa, değiştirme yapısı yakalama testi olarak yorumlanır; daha fazla bilgi için geçerli bir Yakalama Grubuna Dayalı Koşullu Eşleştirme adlı sonraki bölüme bakın. Başka bir deyişle, normal ifade altyapısı yakalanan alt dizeyle eşleşmeyi denemez, bunun yerine grubun varlığı veya yokluğunu test eder.

Aşağıdaki örnek, | ile Desen Eşleştirme bölümünde gösterilen örneğin bir varyasyonudur. Bir sözcük sınırından sonraki ilk üç karakterin iki basamak ve ardından kısa çizgi olup olmadığını belirlemek için koşullu eşleştirme kullanır. Varsa, ABD İşveren Kimlik Numarası (EIN) ile eşleşmeye çalışır. Aksi takdirde, ABD Sosyal Güvenlik Numarası (SSN) ile eşleşmeye çalışır.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example displays the following output:
//       Matches for \b(\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim pattern As String = "\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b"
        Dim input As String = "01-9999999 020-333333 777-88-9999"
        Console.WriteLine("Matches for {0}:", pattern)
        For Each match As Match In Regex.Matches(input, pattern)
            Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
        Next
    End Sub
End Module
' The example displays the following output:
'       Matches for \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b:
'          01-9999999 at position 0
'          777-88-9999 at position 22

Normal ifade deseni \b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b aşağıdaki tabloda gösterildiği gibi yorumlanır:

Desen Açıklama
\b Bir sözcük sınırında başla.
(?(\d{2}-) Sonraki üç karakterin iki basamaktan oluşup oluşmadığını ve ardından kısa çizgi olup olmadığını belirleyin.
\d{2}-\d{7} Önceki desen eşleşiyorsa, iki basamak ve ardından bir kısa çizgi ve yedi basamak eşleştirin.
\d{3}-\d{2}-\d{4} Önceki desen eşleşmiyorsa, üç ondalık basamak, bir kısa çizgi, iki ondalık basamak, başka bir kısa çizgi ve dört ondalık basamak eşleştirin.
\b Bir sözcük sınırıyla eşleş.

Geçerli bir yakalanan grubu temel alan koşullu eşleştirme

Bu dil öğesi, belirtilen bir yakalama grubuyla eşleşip eşleşmediğine bağlı olarak iki desenden birini eşleştirmeye çalışır. Söz dizimi şöyledir:

(?(ad)evet)

veya

(?(ad)evet|hayır)

veya

(?(sayı)evet)

veya

(?(sayı)evet|hayır)

burada ad, bir yakalama grubunun sayısıdır; evet, adın veya sayının eşleşmesi durumunda eşleşecek ifadedir ve eşleşmeyen isteğe bağlı ifade hayırdır (desen sağlanmazsa, boş bir hayır ile eşdeğerdir).

Ad, normal ifade deseninde kullanılan bir yakalama grubunun adına karşılık gelmiyorsa, değiştirme yapısı önceki bölümde açıklandığı gibi bir ifade testi olarak yorumlanır. Bu genellikle ifadenin olarak değerlendirildiğini falsegösterir. Sayı, normal ifade deseninde kullanılan numaralandırılmış bir yakalama grubuna karşılık gelmiyorsa, normal ifade altyapısı bir ArgumentExceptionoluşturur.

Aşağıdaki örnek, | ile Desen Eşleştirme bölümünde gösterilen örneğin bir varyasyonudur. İki basamaktan ve ardından kısa çizgiden oluşan adlı n2 bir yakalama grubu kullanır. Değiştirme yapısı, bu yakalama grubunun giriş dizesinde eşleşip eşleşmediğini sınar. Varsa, değiştirme yapısı dokuz basamaklı ABD İşveren Kimlik Numarası'nın (EIN) son yedi basamağını eşleştirmeyi dener. Eşleşmediyse, dokuz basamaklı abd sosyal güvenlik numarası (SSN) eşleştirmeye çalışır.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example displays the following output:
//       Matches for \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim pattern As String = "\b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b"
        Dim input As String = "01-9999999 020-333333 777-88-9999"
        Console.WriteLine("Matches for {0}:", pattern)
        For Each match As Match In Regex.Matches(input, pattern)
            Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
        Next
    End Sub
End Module

Normal ifade deseni \b(?<n2>\d{2}-)?(?(n2)\d{7}|\d{3}-\d{2}-\d{4})\b aşağıdaki tabloda gösterildiği gibi yorumlanır:

Desen Açıklama
\b Bir sözcük sınırında başla.
(?<n2>\d{2}-)? İki basamağı ve ardından kısa çizgiyi içeren sıfır veya bir yinelemeyi eşleştirin. Bu yakalama grubunu olarak adlandır.n2
(?(n2) Giriş dizesinde eşleşip eşleşmediğini n2 test edin.
\d{7} Eşleştirildiyse n2 , yedi ondalık basamak eşleştirin.
|\d{3}-\d{2}-\d{4} n2 Eşleşmediyse, üç ondalık basamak, kısa çizgi, iki ondalık basamak, başka bir kısa çizgi ve dört ondalık basamak eşleştirin.
\b Bir sözcük sınırıyla eşleş.

Bu örneğin adlandırılmış grup yerine numaralandırılmış grup kullanan bir varyasyonu aşağıdaki örnekte gösterilmiştir. Normal ifade deseni şeklindedir \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b";
      string input = "01-9999999 020-333333 777-88-9999";
      Console.WriteLine("Matches for {0}:", pattern);
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine("   {0} at position {1}", match.Value, match.Index);
   }
}
// The example display the following output:
//       Matches for \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
//          01-9999999 at position 0
//          777-88-9999 at position 22
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim pattern As String = "\b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b"
        Dim input As String = "01-9999999 020-333333 777-88-9999"
        Console.WriteLine("Matches for {0}:", pattern)
        For Each match As Match In Regex.Matches(input, pattern)
            Console.WriteLine("   {0} at position {1}", match.Value, match.Index)
        Next
    End Sub
End Module
' The example displays the following output:
'       Matches for \b(\d{2}-)?(?(1)\d{7}|\d{3}-\d{2}-\d{4})\b:
'          01-9999999 at position 0
'          777-88-9999 at position 22

Ayrıca bkz.