Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
yöntemini çağırarak giriş metninde normal ifade deseninin Regex.IsMatch oluşup oluşmadığı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 metin oluşumlarının bir veya tümünü alın. Önceki yöntem, eşleşen metin hakkında bilgi sağlayan bir System.Text.RegularExpressions.Match nesne döndürür. İkincisi, ayrıştırılan metinde bulunan her eşleşme için bir MatchCollection nesne içeren bir System.Text.RegularExpressions.Match nesne döndürür.
yöntemini çağırarak normal ifade deseni Regex.Replace ile 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
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ı \1 gruba 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.
İlgili makaleler
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 |