.NET normal ifadeleri

Normal ifadeler, metin işleme için güçlü, esnek ve verimli bir yöntem sunar. Normal ifadelerin kapsamlı desen eşleştirme gösterimi, büyük miktarda metni hızla ayrıştırmanıza olanak tanır:

  • Belirli karakter desenlerini bulun.
  • Önceden tanımlanmış bir desenle (e-posta adresi gibi) eşleştiğinden emin olmak için metni doğrulayın.
  • Metin alt dizelerini ayıklayın, düzenleyin, değiştirin veya silin.
  • Rapor oluşturmak için koleksiyona ayıklanmış dizeler ekleyin.

Dizeler üzerinde çalışan veya büyük metin bloklarını ayrıştıran uygulamalar için normal ifadeler vazgeçilmez bir araçtır.

Normal ifadeler nasıl çalışır?

Normal ifadelerle metin işlemenin orta parçası, .NET'teki nesnesi tarafından System.Text.RegularExpressions.Regex temsil edilen normal ifade altyapısıdır. Metinleri normal ifadeler kullanarak işlemek için, normal ifade altyapısına en azından aşağıdaki iki bilgi öğesinin sağlanması gerekir:

  • Metinde tanımlanacak olan normal ifade deseni.

    .NET'te normal ifade desenleri, Perl 5 normal ifadeleriyle uyumlu olan ve sağdan sola eşleştirme gibi bazı ek özellikler ekleyen özel bir söz dizimi veya dille tanımlanır. Daha fazla bilgi için bkz . Normal İfade Dili - Hızlı Başvuru.

  • Normal ifade deseni için ayrıştırılacak olan metin.

Regex sınıfının yöntemleri aşağıdaki işlemleri gerçekleştirmenizi sağlar:

Normal ifade nesnesi modeline genel bakış için bkz . Normal İfade Nesne Modeli.

Normal ifade dili hakkında daha fazla bilgi için bkz . Normal İfade Dili - Hızlı Başvuru veya aşağıdaki broşürlerden birini indirip yazdırma:

Normal ifade örnekleri

sınıfı, String daha büyük bir dizedeki değişmez dizeleri bulmak istediğinizde kullanabileceğiniz dize arama ve değiştirme yöntemlerini içerir. Normal ifadeler en çok, büyük bir dizedeki alt dizelerin birini konumlandırmak istediğinizde veya aşağıdaki örnekte gösterildiği gibi bir dizede desenleri tanımlamak istediğinizde kullanışlıdır.

Uyarı

Güvenilmeyen girişi işlemek için kullanırken System.Text.RegularExpressions bir zaman aşımı geçirin. Kötü amaçlı bir kullanıcı için giriş RegularExpressionssağlayabilir ve bu da Hizmet Reddi saldırısına neden olabilir. ASP.NET Zaman aşımı kullanan RegularExpressions Core framework API'leri.

İpucu

Ad System.Web.RegularExpressions alanı, HTML, XML ve ASP.NET belgelerinden dizeleri ayrıştırma için önceden tanımlanmış normal ifade desenleri uygulayan bir dizi normal ifade nesnesi içerir. Örneğin, TagRegex sınıfı bir dizedeki başlangıç etiketlerini tanımlar ve sınıfı bir dizedeki CommentRegex ASP.NET açıklamaları tanımlar.

Örnek 1: Alt dizeleri değiştirme

Bir posta listesinin, ada ve soyada ek olarak bazen bir ünvan (Mr., Mrs., Miss veya Ms.) içerdiğini varsayın. Listeden zarf etiketleri oluştururken başlıkları eklemek istemediğinizi varsayalım. Bu durumda, aşağıdaki örnekte gösterildiği gibi başlıkları kaldırmak için normal bir ifade kullanabilirsiniz:

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
      string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels",
                         "Abraham Adams", "Ms. Nicole Norris" };
      foreach (string name in names)
         Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
   }
}
// The example displays the following output:
//    Henry Hunt
//    Sara Samuels
//    Abraham Adams
//    Nicole Norris
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim pattern As String = "(Mr\.? |Mrs\.? |Miss |Ms\.? )"
        Dim names() As String = {"Mr. Henry Hunt", "Ms. Sara Samuels", _
                                  "Abraham Adams", "Ms. Nicole Norris"}
        For Each name As String In names
            Console.WriteLine(Regex.Replace(name, pattern, String.Empty))
        Next
    End Sub
End Module
' The example displays the following output:
'    Henry Hunt
'    Sara Samuels
'    Abraham Adams
'    Nicole Norris

Normal ifade deseni (Mr\.? |Mrs\.? |Miss |Ms\.? ) " Bay ", "Bay ", "Bayan ", "Bayan ", "Bayan ", "Ms " veya "Ms. " şeklindeki herhangi bir oluşumla eşleşir. Regex.Replace yöntemine yapılan çağrı, eşleşen dizeyi String.Empty ile değiştirir; yani başka bir deyişle bu dizeyi orijinal dizeden kaldırır.

Örnek 2: Yinelenen sözcükleri tanımlama

Kelimeleri yanlışlıkla yinelemek yazarların yaptığı yaygın bir hatadır. Aşağıdaki örnekte gösterildiği gibi yinelenen sözcükleri tanımlamak için normal ifade kullanın:

using System;
using System.Text.RegularExpressions;

public class Class1
{
   public static void Main()
   {
      string pattern = @"\b(\w+?)\s\1\b";
      string input = "This this is a nice day. What about this? This tastes good. I saw a a dog.";
      foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
         Console.WriteLine("{0} (duplicates '{1}') at position {2}",
                           match.Value, match.Groups[1].Value, match.Index);
   }
}
// The example displays the following output:
//       This this (duplicates 'This') at position 0
//       a a (duplicates 'a') at position 66
Imports System.Text.RegularExpressions

Module modMain
    Public Sub Main()
        Dim pattern As String = "\b(\w+?)\s\1\b"
        Dim input As String = "This this is a nice day. What about this? This tastes good. I saw a a dog."
        For Each match As Match In Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
            Console.WriteLine("{0} (duplicates '{1}') at position {2}", _
                              match.Value, match.Groups(1).Value, match.Index)
        Next
    End Sub
End Module
' The example displays the following output:
'       This this (duplicates 'This') at position 0
'       a a (duplicates 'a') at position 66

Normal ifade deseni \b(\w+?)\s\1\b aşağıdaki gibi yorumlanabilir:

Desen Yorumlama
\b Bir sözcük sınırında başla.
(\w+?) Bir veya daha fazla sözcük karakterini eşleştirin, ancak mümkün olduğunca az karakter kullanın. Birlikte, olarak \1başvurulabilecek bir grup oluştururlar.
\s Bir boşluk karakteri ile eşleştirin.
\1 adlı \1gruba eşit alt dizeyi eşleştirin.
\b Bir sözcük sınırıyla eşleş.

Regex.Matches yöntemi, normal ifade ayarları RegexOptions.IgnoreCase şeklinde ayarlanmış olarak çağırılır. Bu nedenle eşleştirme işlemi büyük/küçük harfe duyarsızdır, ve örnek "This this" alt dizesini bir yineleme olarak tanımlar.

Giriş dizesi "bu mu? unutmayın. Ancak, aradaki noktalama işareti nedeniyle, yineleme olarak tanımlanmamıştır.

Örnek 3: Kültüre duyarlı bir normal ifadeyi dinamik olarak oluşturma

Aşağıdaki örnek, tarafından sunulan esneklikle birlikte normal ifadelerin gücünü gösterir. NET'in genelleştirme özellikleri. Sistemin geçerli kültüründeki para birimi değerlerinin biçimini belirlemek için NumberFormatInfo nesnesini kullanır. Ardından metinden para birimi değerleri ayıklayan bir normal ifadeyi dinamik olarak oluşturmak için bu bilgiyi kullanır. Her bir eşleşme için, yalnızca sayısal dizeyi içeren alt grubu ayıklar, bir Decimal değerine dönüştürür ve toplamı hesaplar.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      // Define text to be parsed.
      string input = "Office expenses on 2/13/2008:\n" +
                     "Paper (500 sheets)                      $3.95\n" +
                     "Pencils (box of 10)                     $1.00\n" +
                     "Pens (box of 10)                        $4.49\n" +
                     "Erasers                                 $2.19\n" +
                     "Ink jet printer                        $69.95\n\n" +
                     "Total Expenses                        $ 81.58\n";

      // Get current culture's NumberFormatInfo object.
      NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
      // Assign needed property values to variables.
      string currencySymbol = nfi.CurrencySymbol;
      bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
      string groupSeparator = nfi.CurrencyGroupSeparator;
      string decimalSeparator = nfi.CurrencyDecimalSeparator;

      // Form regular expression pattern.
      string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") +
                       @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" +
                       Regex.Escape(decimalSeparator) + "[0-9]+)?)" +
                       (! symbolPrecedesIfPositive ? currencySymbol : "");
      Console.WriteLine( "The regular expression pattern is:");
      Console.WriteLine("   " + pattern);

      // Get text that matches regular expression pattern.
      MatchCollection matches = Regex.Matches(input, pattern,
                                              RegexOptions.IgnorePatternWhitespace);
      Console.WriteLine("Found {0} matches.", matches.Count);

      // Get numeric string, convert it to a value, and add it to List object.
      List<decimal> expenses = new List<Decimal>();

      foreach (Match match in matches)
         expenses.Add(Decimal.Parse(match.Groups[1].Value));

      // Determine whether total is present and if present, whether it is correct.
      decimal total = 0;
      foreach (decimal value in expenses)
         total += value;

      if (total / 2 == expenses[expenses.Count - 1])
         Console.WriteLine("The expenses total {0:C2}.", expenses[expenses.Count - 1]);
      else
         Console.WriteLine("The expenses total {0:C2}.", total);
   }
}
// The example displays the following output:
//       The regular expression pattern is:
//          \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
//       Found 6 matches.
//       The expenses total $81.58.
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Text.RegularExpressions

Public Module Example
    Public Sub Main()
        ' Define text to be parsed.
        Dim input As String = "Office expenses on 2/13/2008:" + vbCrLf + _
                              "Paper (500 sheets)                      $3.95" + vbCrLf + _
                              "Pencils (box of 10)                     $1.00" + vbCrLf + _
                              "Pens (box of 10)                        $4.49" + vbCrLf + _
                              "Erasers                                 $2.19" + vbCrLf + _
                              "Ink jet printer                        $69.95" + vbCrLf + vbCrLf + _
                              "Total Expenses                        $ 81.58" + vbCrLf
        ' Get current culture's NumberFormatInfo object.
        Dim nfi As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
        ' Assign needed property values to variables.
        Dim currencySymbol As String = nfi.CurrencySymbol
        Dim symbolPrecedesIfPositive As Boolean = CBool(nfi.CurrencyPositivePattern Mod 2 = 0)
        Dim groupSeparator As String = nfi.CurrencyGroupSeparator
        Dim decimalSeparator As String = nfi.CurrencyDecimalSeparator

        ' Form regular expression pattern.
        Dim pattern As String = Regex.Escape(CStr(IIf(symbolPrecedesIfPositive, currencySymbol, ""))) + _
                                "\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + _
                                Regex.Escape(decimalSeparator) + "[0-9]+)?)" + _
                                CStr(IIf(Not symbolPrecedesIfPositive, currencySymbol, ""))
        Console.WriteLine("The regular expression pattern is: ")
        Console.WriteLine("   " + pattern)

        ' Get text that matches regular expression pattern.
        Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace)
        Console.WriteLine("Found {0} matches. ", matches.Count)

        ' Get numeric string, convert it to a value, and add it to List object.
        Dim expenses As New List(Of Decimal)

        For Each match As Match In matches
            expenses.Add(Decimal.Parse(match.Groups.Item(1).Value))
        Next

        ' Determine whether total is present and if present, whether it is correct.
        Dim total As Decimal
        For Each value As Decimal In expenses
            total += value
        Next

        If total / 2 = expenses(expenses.Count - 1) Then
            Console.WriteLine("The expenses total {0:C2}.", expenses(expenses.Count - 1))
        Else
            Console.WriteLine("The expenses total {0:C2}.", total)
        End If
    End Sub
End Module
' The example displays the following output:
'       The regular expression pattern is:
'          \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
'       Found 6 matches.
'       The expenses total $81.58.

Geçerli kültürü İngilizce - Birleşik Devletler (en-US) olan bir bilgisayarda, örnek normal ifadeyi \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)dinamik olarak oluşturur. Bu normal ifade deseni aşağıdaki şekilde yorumlanabilir:

Desen Yorumlama
\$ Giriş dizesinde dolar simgesinin ($) tek bir örneğini arayın. Normal ifade deseni dizesi, dolar simgesinin bir normal ifade yer işareti yerine sabit değer olarak yorumlanmasını sağlamak için bir ters eğik çizgi içerir. Yalnızca $ simge, normal ifade altyapısının eşleşmesini bir dizenin sonunda başlatmayı denemesi gerektiğini gösterir. Geçerli kültürün para birimi simgesinin normal ifade simgesi olarak yanlış yorumlanmasını sağlamak için örnek, karakterin kaçış yöntemini çağırır Regex.Escape .
\s* Bir boşluk karakterin sıfır veya daha fazla oluşumunu arayın.
[-+]? Pozitif veya negatif bir işaretin sıfır veya bir oluşumunu arayın.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Dış parantezler bu ifadeyi bir yakalama grubu veya alt ifade olarak tanımlar. Eğer bir eşleşme bulunursa eşleşen dizenin bu bölümüyle ilgili bilgi, Group özelliği tarafından döndürülen GroupCollection nesnesindeki ikinci Match.Groups nesnesinden alınabilir. Koleksiyondaki ilk öğe eşleşmenin tamamını temsil eder.
[0-9]{0,3} 0 ile 9 arasındaki ondalık basamakların sıfırdan üç taneye kadar oluşumunu arayın.
(,[0-9]{3})* Ardından üç ondalık basamak gelen bir grup ayracının sıfır veya daha fazla oluşumunu arayın.
\. Ondalık ayracının tek bir oluşumunu arayın.
[0-9]+ Bir veya daha fazla ondalık basamak arayın.
(\.[0-9]+)? Ardından en az bir ondalık basamak gelen ondalık ayracın sıfır veya bir oluşumunu arayın.

Giriş dizesinde her alt desen bulunursa, eşleşme başarılı olur ve eşleşme hakkında bilgi içeren bir Match nesne nesneye MatchCollection eklenir.

Ünvan Açıklama
Normal İfade Dili - Hızlı Başvuru Normal ifadeler tanımlamak için kullanabileceğiniz karakterler, operatörler ve yapılar kümesi hakkında bilgi sağlar.
Normal İfade Nesne Modeli Normal ifade sınıflarının nasıl kullanılacağını gösteren bilgileri ve kod örneklerini sağlar.
Normal İfade Davranışının Ayrıntıları .NET normal ifadelerinin özellikleri ve davranışı hakkında bilgi sağlar.
Visual Studio'da normal ifadeleri kullanma

Başvuru