.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:
Regex.IsMatch metodunu çağırarak normal ifade deseninin giriş metninde oluşup oluşmayacağını belirleyin. Metin doğrulama yöntemini kullanan IsMatch bir örnek için bkz . Nasıl yapılır: Dizelerin Geçerli E-posta Biçiminde Olduğunu Doğrulama.
Regex.Match veya Regex.Matches yöntemini çağırarak, normal ifade deseniyle eşleşen metnin bir veya tüm oluşumlarını alın. İlk yöntem, eşleşen metin hakkında bilgi sağlayan bir System.Text.RegularExpressions.Match nesnesi döndürür. İkinci yöntem, ayrıştırılan metinde bulunan her bir eşleşme için bir MatchCollection nesnesi içeren bir System.Text.RegularExpressions.Match nesnesi döndürür.
Regex.Replace yöntemini çağırarak normal ifade deseniyle eşleşen metni değiştirin. Tarih biçimlerini değiştirmek ve bir dizeden geçersiz karakterleri kaldırmak için yöntemini kullanan Replace örnekler için bkz . Nasıl yapılır: Dizeden Geçersiz Karakterleri Çıkarma ve Örnek: Tarih Biçimlerini Değiştirme.
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ş RegularExpressions
sağ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 \1 başvurulabilecek bir grup oluştururlar. |
\s |
Bir boşluk karakteri ile eşleştirin. |
\1 |
adlı \1 gruba 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.
İlgili makaleler
Ü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 |