Normal İfadeler (C++/CLI)
.NET Framework'teki normal ifade sınıflarını kullanarak çeşitli dize işlemlerini gösterir.
Aşağıdaki konular dizeleri aramak, ayrıştırmak ve değiştirmek için .NET Framework System.Text.RegularExpressions ad alanının (ve bir durumda System.String.Split yönteminin) kullanımını gösterir.
Normal İfadeleri Kullanarak Dizeleri Ayrıştırma
Aşağıdaki kod örneği, ad alanında sınıfını kullanarak Regex basit dize ayrıştırma işlemini System.Text.RegularExpressions gösterir. Birden çok tür sözcük ayırıcısı içeren bir dize oluşturulur. Dize daha sonra sınıfı ile Match birlikte kullanılarak Regex ayrıştırılır. Ardından, tümcedeki her sözcük ayrı olarak görüntülenir.
Örnek
// regex_parse.cpp
// compile with: /clr
#using <system.dll>
using namespace System;
using namespace System::Text::RegularExpressions;
int main( )
{
int words = 0;
String^ pattern = "[a-zA-Z]*";
Console::WriteLine( "pattern : '{0}'", pattern );
Regex^ regex = gcnew Regex( pattern );
String^ line = "one\ttwo three:four,five six seven";
Console::WriteLine( "text : '{0}'", line );
for( Match^ match = regex->Match( line );
match->Success; match = match->NextMatch( ) )
{
if( match->Value->Length > 0 )
{
words++;
Console::WriteLine( "{0}", match->Value );
}
}
Console::WriteLine( "Number of Words : {0}", words );
return 0;
}
Split Yöntemini Kullanarak Dizeleri Ayrıştırma
Aşağıdaki kod örneği, bir dizedeki System.String.Split her sözcüğü ayıklamak için yönteminin kullanılmasını gösterir. Birden çok tür sözcük ayırıcısı içeren bir dize oluşturulur ve ardından bir çizgi oluşturucu listesiyle çağrılarak Split ayrıştırılır. Ardından, tümcedeki her sözcük ayrı olarak görüntülenir.
Örnek
// regex_split.cpp
// compile with: /clr
using namespace System;
int main()
{
String^ delimStr = " ,.:\t";
Console::WriteLine( "delimiter : '{0}'", delimStr );
array<Char>^ delimiter = delimStr->ToCharArray( );
array<String^>^ words;
String^ line = "one\ttwo three:four,five six seven";
Console::WriteLine( "text : '{0}'", line );
words = line->Split( delimiter );
Console::WriteLine( "Number of Words : {0}", words->Length );
for (int word=0; word<words->Length; word++)
Console::WriteLine( "{0}", words[word] );
return 0;
}
Basit Eşleştirme için Normal İfadeleri Kullanma
Aşağıdaki kod örneği, tam alt dize eşleşmelerini aramak için normal ifadeleri kullanır. Arama, giriş olarak iki dize alan statik IsMatch yöntem tarafından gerçekleştirilir. Birincisi aranacak dize, ikincisi ise aranacak desendir.
Örnek
// regex_simple.cpp
// compile with: /clr
#using <System.dll>
using namespace System;
using namespace System::Text::RegularExpressions;
int main()
{
array<String^>^ sentence =
{
"cow over the moon",
"Betsy the Cow",
"cowering in the corner",
"no match here"
};
String^ matchStr = "cow";
for (int i=0; i<sentence->Length; i++)
{
Console::Write( "{0,24}", sentence[i] );
if ( Regex::IsMatch( sentence[i], matchStr,
RegexOptions::IgnoreCase ) )
Console::WriteLine(" (match for '{0}' found)", matchStr);
else
Console::WriteLine("");
}
return 0;
}
Veri Alanlarını Ayıklamak için Normal İfadeler Kullanma
Aşağıdaki kod örneği, biçimlendirilmiş bir dizeden veri ayıklamak için normal ifadelerin kullanımını gösterir. Aşağıdaki kod örneği, e-posta adresine karşılık gelen bir desen belirtmek için sınıfını kullanır Regex . Bu patter, her e-posta adresinin kullanıcı ve konak adı bölümlerini almak için kullanılabilecek alan tanımlayıcılarını içerir. sınıfı Match , gerçek desen eşleştirmeyi gerçekleştirmek için kullanılır. Verilen e-posta adresi geçerliyse, kullanıcı adı ve konak adları ayıklanır ve görüntülenir.
Örnek
// Regex_extract.cpp
// compile with: /clr
#using <System.dll>
using namespace System;
using namespace System::Text::RegularExpressions;
int main()
{
array<String^>^ address=
{
"jay@southridgevideo.com",
"barry@adatum.com",
"treyresearch.net",
"karen@proseware.com"
};
Regex^ emailregex = gcnew Regex("(?<user>[^@]+)@(?<host>.+)");
for (int i=0; i<address->Length; i++)
{
Match^ m = emailregex->Match( address[i] );
Console::Write("\n{0,25}", address[i]);
if ( m->Success )
{
Console::Write(" User='{0}'",
m->Groups["user"]->Value);
Console::Write(" Host='{0}'",
m->Groups["host"]->Value);
}
else
Console::Write(" (invalid email address)");
}
Console::WriteLine("");
return 0;
}
Verileri Yeniden Düzenlemek için Normal İfadeler Kullanma
Aşağıdaki kod örneği, .NET Framework normal ifade desteğinin verileri yeniden düzenlemek veya yeniden biçimlendirmek için nasıl kullanılabileceğini gösterir. Aşağıdaki kod örneği, bir dizeden ad ve soyadlarını ayıklamak ve ardından bu ad öğelerini ters sırada görüntülemek için ve Match sınıflarını kullanırRegex.
Regex sınıfı, verilerin geçerli biçimini açıklayan normal bir ifade oluşturmak için kullanılır. İki adın virgülle ayrıldığı varsayılır ve virgül çevresinde herhangi bir miktarda boşluk kullanabilir. Yöntemi Match daha sonra her dizeyi analiz etmek için kullanılır. Başarılı olursa, ad ve soyadlar nesneden Match alınır ve görüntülenir.
Örnek
// regex_reorder.cpp
// compile with: /clr
#using <System.dll>
using namespace System;
using namespace Text::RegularExpressions;
int main()
{
array<String^>^ name =
{
"Abolrous, Sam",
"Berg,Matt",
"Berry , Jo",
"www.contoso.com"
};
Regex^ reg = gcnew Regex("(?<last>\\w*)\\s*,\\s*(?<first>\\w*)");
for ( int i=0; i < name->Length; i++ )
{
Console::Write( "{0,-20}", name[i] );
Match^ m = reg->Match( name[i] );
if ( m->Success )
{
String^ first = m->Groups["first"]->Value;
String^ last = m->Groups["last"]->Value;
Console::WriteLine("{0} {1}", first, last);
}
else
Console::WriteLine("(invalid)");
}
return 0;
}
Aramak ve Değiştirmek için Normal İfadeleri Kullanma
Aşağıdaki kod örneği, normal ifade sınıfının Regex arama yapmak ve değiştirmek için nasıl kullanılabileceğini gösterir. Bu yöntemle Replace yapılır. Kullanılan sürüm giriş olarak iki dize alır: değiştirilecek dize ve nesneye verilen Regex desenle eşleşen bölümlerin (varsa) yerine eklenecek dize.
Bu kod, bir dizedeki tüm basamakları alt çizgilerle (_) değiştirir ve sonra bunları boş bir dizeyle değiştirerek etkili bir şekilde kaldırır. Aynı etki tek bir adımda gerçekleştirilebilir, ancak burada gösterim amacıyla iki adım kullanılır.
Örnek
// regex_replace.cpp
// compile with: /clr
#using <System.dll>
using namespace System::Text::RegularExpressions;
using namespace System;
int main()
{
String^ before = "The q43uick bro254wn f0ox ju4mped";
Console::WriteLine("original : {0}", before);
Regex^ digitRegex = gcnew Regex("(?<digit>[0-9])");
String^ after = digitRegex->Replace(before, "_");
Console::WriteLine("1st regex : {0}", after);
Regex^ underbarRegex = gcnew Regex("_");
String^ after2 = underbarRegex->Replace(after, "");
Console::WriteLine("2nd regex : {0}", after2);
return 0;
}
Veri Biçimlendirmesini Doğrulamak için Normal İfadeleri Kullanma
Aşağıdaki kod örneği, bir dizenin biçimlendirmesini doğrulamak için normal ifadelerin kullanımını gösterir. Aşağıdaki kod örneğinde, dize geçerli bir telefon numarası içermelidir. Aşağıdaki kod örneği, her alanın geçerli bir telefon numarasını temsil ettiğini belirtmek için "\d{3}-\d{3}-\d{4}" dizesini kullanır. Dizedeki "d" bir basamağı, her "d" işaretinden sonraki bağımsız değişken ise mevcut olması gereken basamak sayısını gösterir. Bu durumda, sayinin tirelerle ayrılması gerekir.
Örnek
// regex_validate.cpp
// compile with: /clr
#using <System.dll>
using namespace System;
using namespace Text::RegularExpressions;
int main()
{
array<String^>^ number =
{
"123-456-7890",
"444-234-22450",
"690-203-6578",
"146-893-232",
"146-839-2322",
"4007-295-1111",
"407-295-1111",
"407-2-5555",
};
String^ regStr = "^\\d{3}-\\d{3}-\\d{4}$";
for ( int i = 0; i < number->Length; i++ )
{
Console::Write( "{0,14}", number[i] );
if ( Regex::IsMatch( number[i], regStr ) )
Console::WriteLine(" - valid");
else
Console::WriteLine(" - invalid");
}
return 0;
}
İlgili Bölümler
.NET Framework Normal İfadeleri