.NET normal ifadeleri
Normal ifadeler, metin işleme için güçlü, esnek ve verimli bir yöntem sunar. Normal ifadelerin kapsamlı kalıp eşleme gösterimi, büyük miktarlarda metni hızlıca ayrıştırabilmenizi sağlar:
- Belirli karakter düzenlerini bulun.
- Önceden tanımlanmış bir Düzenle (örneğin, e-posta adresi) ile 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.
- Bir rapor oluşturmak için bir koleksiyona ayıklanan 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 centeru parçası, .NET içindeki nesne tarafından temsil edilen normal ifade altyapısıdır System.Text.RegularExpressions.Regex . 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 ifadelerle uyumlu özel bir sözdizimi veya dil tarafından tanımlanır ve sağdan sola eşleme gibi bazı ek özellikler ekler. Daha fazla bilgi için bkz. normal Ifade 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. IsMatchMetni doğrulamak için yöntemini kullanan 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. ReplaceTarih biçimlerini değiştirmek ve bir dizeden geçersiz karakterleri kaldırmak için yöntemini kullanan örnekler için bkz. nasıl yapılır: bir dizeden geçersiz karakterleri bırakma ve örnek: tarih biçimlerini değiştirme.
Normal ifade nesne modeline genel bakış için bkz. normal Ifade nesne modeli.
Normal ifade dili hakkında daha fazla bilgi için bkz. normal Ifade dili-hızlı başvuru veya indirme ve bu broşürden birini indirme ve yazdırma:
Normal ifade örnekleri
String sınıfı, daha büyük bir dizede sabit değer dizelerini bulmak istediğiniz zaman kullanabileceğiniz dize arama ve yerleş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ı
System.Text.RegularExpressionsGüvenilmeyen girişi işlemek için kullanırken bir zaman aşımı geçirin. Kötü niyetli bir Kullanıcı, RegularExpressions hizmet reddi saldırısınaneden olacak giriş sağlayabilir. Zaman aşımını geçen ASP.NET Core Framework API 'Leri RegularExpressions .
İpucu
System.Web.RegularExpressionsad alanı, HTML, XML ve ASP.NET belgelerinden dizeleri ayrıştırmak 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 CommentRegex sınıf ASP.NET açıklamaları bir dizede tanımlar.
Örnek 1: alt dizeleri değiştir
Bir posta listesinin, ada ve soyada ek olarak bazen bir ünvan (Mr., Mrs., Miss veya Ms.) içerdiğini varsayın. Eğer listeden zarf etiketleri oluştururken ünvanları dahil etmek istemiyorsanız, aşağıdaki örnekte gösterildiği gibi ünvanları kaldırmak için bir normal 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 deseninin (Mr\.? |Mrs\.? |Miss |Ms\.? ) her türlü "Mr", "Mr.", "Mrs", "Mrs.", "Isabetsizlik", "MS veya" MS. "gibi herhangi bir oluşumu 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ımla
Kelimeleri yanlışlıkla yinelemek yazarların yaptığı yaygın bir hatadır. Bir normal ifade, aşağıdaki örnekte gösterdiği gibi yinelenen kelimeleri tanımlamak için kullanılabilir.
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 deseninin \b(\w+?)\s\1\b Şu şekilde yorumlanması için:
| Desen | Yorum |
|---|---|
\b |
Bir sözcük sınırında başla. |
(\w+?) |
Bir veya daha fazla sözcük karakterini ve mümkün olduğunca az karakter eşleştirin. Birlikte, olarak başvurulabilen bir grup oluşturur \1 . |
\s |
Bir boşluk karakteri ile eşleştirin. |
\1 |
Adlı gruba eşit olan alt dizeyle eşleştirin \1 . |
\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 "This?" alt dizesini içerir. unutmayın. Ancak, aradaki noktalama işareti nedeniyle bu, bir yineleme olarak tanımlanmaz.
Örnek 3: dinamik olarak kültüre duyarlı normal ifade derleme
Aşağıdaki örnek, tarafından sunulan esneklikle birlikte normal ifadelerin gücünü göstermektedir. 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ü Ingilizce-Birleşik Devletler (en-US) olan bir bilgisayarda, örnek dinamik ifadeyi dinamik olarak oluşturur \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) . Bu normal ifade deseni aşağıdaki şekilde yorumlanabilir:
| Desen | Yorum |
|---|---|
\$ |
Giriş dizesinde dolar simgesinin () tek bir oluşumunu 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. ( $ Tek başına simge, normal ifade altyapısının bir dizenin sonunda eşleşme başlatmaya başlaması gerektiğini gösterir.) Geçerli kültürün para birimi simgesinin bir normal ifade simgesi olarak yanlış yorumlanmadığından emin olmak için örnek, Regex.Escape karakteri kaçış yöntemini çağırır. |
\s* |
Bir boşluk karakterin sıfır veya daha fazla oluşumunu arayın. |
[-+]? |
Bir artı işareti veya eksi işaretinin sıfır veya bir oluşumunu arayın. |
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) |
Bu ifadenin dışındaki parantezler onu 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 tüm eşleşmeyi 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. |
Bu alt desenlerin her biri giriş dizesinde bulunuyorsa, eşleşme başarılı olur ve Match nesnesine eşleşme hakkında bilgi içeren bir MatchCollection nesnesi eklenir.
İlgili konular
| Başlık | 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 Nesnesi 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ışları hakkında bilgi sağlar. |
| Visual Studio içindeki normal ifadeleri kullanma |