Aracılığıyla paylaş


.NET normal ifadeleri

Normal ifadeler, metin işleme için güçlü, esnek ve verimli bir yöntem sağlar. 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 bulma.
  • Ö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.

Dizelerle ilgilenen veya büyük metin bloklarını ayrıştıran birçok uygulama 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. Normal ifadeler kullanılarak metin işlenmesi için en azından normal ifade altyapısının aşağıdaki iki bilgi öğesiyle birlikte sağlanması gerekir:

  • Metinde belirlemek için düzenli 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 metin.

sınıfının yöntemleri Regex aşağıdaki işlemleri gerçekleştirmenize olanak 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

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

Uyarı

Güvenilmeyen girişi işleme için System.Text.RegularExpressions kullanırken zaman aşımı değeri girin. Kötü niyetli bir kullanıcı RegularExpressions giriş sağlayarak bir Hizmet Reddi saldırısına yol açabilir. ASP.NET Core çerçeve API'leri zaman aşımı belirten RegularExpressions kullanır.

Tavsiye

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

Posta listesinin bazen ad ve soyadıyla birlikte bir başlık (Mr., Mrs., Miss veya Ms.) içeren adlar içerdiğini varsayalım. 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. yöntemine yapılan Regex.Replace çağrı, eşleşen dizeyi ile String.Emptydeğiştirir; başka bir deyişle, bunu özgün dizeden kaldırır.

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

Sözcükleri 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($"{match.Value} (duplicates '{match.Groups[1].Value}') at position {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, \1 olarak adlandırılabilecek bir grup oluştururlar.
\s Bir boşluk karakteri eşleştirin.
\1 adlı \1gruba eşit alt dizeyi eşleştirin.
\b Bir kelime sınırını eşleştir.

Regex.Matches yöntemi, normal ifade seçenekleri ayarlanmış olarak çağrılırRegexOptions.IgnoreCase. Bu nedenle, eşleştirme işlemi büyük/küçük harfe duyarlı değildir ve örnek "Bu bu" alt dizesini yineleme olarak tanımlar.

Giriş dizesi 'this?' alt dizesini içerir. Bu". 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, .NET'in uluslararasılaştırma özellikleriyle birleştirilen düzenli ifadelerin gücünü göstermektedir. Sistemin geçerli kültüründeki para birimi değerlerinin biçimini belirlemek için nesnesini kullanır NumberFormatInfo . Ardından bu bilgileri kullanarak metinden para birimi değerlerini ayıklayan bir normal ifadeyi dinamik olarak oluşturur. Her eşleşme için yalnızca sayısal dizeyi içeren alt grubu ayıklar, bir Decimal değere dönüştürür ve çalışan 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 {matches.Count} matches.");

      // 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 {expenses[expenses.Count - 1]:C2}.");
      else
         Console.WriteLine($"The expenses total {total:C2}.");
   }
}
// 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 - Amerika Birleşik Devletleri (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 düzeni aşağıdaki gibi yorumlanabilir:

Desen Yorumlama
\$ Giriş dizesinde dolar simgesinin ($) tek bir örneğini arayın. Normal ifade desen dizesi, dolar simgesinin normal ifade bağlantısı yerine tam anlamıyla yorumlanması gerektiğini belirten bir ters eğik çizgi içerir. Yalnızca $ simge, normal ifade motorunun eşleştirmesini bir dizenin sonunda başlatmayı denemesi gerektiğini gösterir. Geçerli kültürün para birimi sembolünün düzenli ifade sembolü olarak yanlış yorumlanmaması için örnek, karakterin kaçmasını sağlamak amacıyla Regex.Escape yöntemini çağırır.
\s* Beyaz boşluk karakterinin sıfır veya daha fazla kez bulunmasını arayın.
[-+]? Pozitif veya negatif bir işaretin hiç veya bir kere bulunduğunu kontrol edin.
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) Dış parantezler bu ifadeyi bir yakalama grubu veya alt ifade olarak tanımlar. Eşleşme bulunursa, eşleşen dizenin bu bölümü hakkındaki bilgiler, Group özelliği tarafından döndürülen GroupCollection nesnesindeki ikinci Match.Groups nesneden alınabilir. Koleksiyondaki ilk öğe eşleşmenin tamamını temsil eder.
[0-9]{0,3} 0 ile 9 arasındaki ondalık rakamların sıfır ila üç kez görünmesini arayın.
(,[0-9]{3})* Grup ayırıcıdan sonra gelen üç basamaklı herhangi bir sayının sıfır veya daha fazla tekrarını arayın.
\. Ondalık ayırıcısının tek bir oluşumunu arayın.
[0-9]+ Bir veya daha fazla ondalık rakam arayın.
(\.[0-9]+)? Ondalık ayırıcıdan sıfır veya bir kez görünmesi ve ardından en az bir ondalık basamak gelmesi durumunu 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.

Başlık Açıklama
Düzenli İfade Dili - Hızlı Referans Normal ifadeleri tanımlamak için kullanabileceğiniz karakter, işleç ve yapı 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 bilgi ve kod örnekleri 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

Kaynak