Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Demonstruje różne operacje na ciągach przy użyciu klas wyrażeń regularnych w programie .NET Framework.
W poniższych tematach przedstawiono użycie przestrzeni nazw programu .NET Framework System.Text.RegularExpressions (i w jednym przypadku System.String.Split metody) do wyszukiwania, analizowania i modyfikowania ciągów.
Analizowanie ciągów przy użyciu wyrażeń regularnych
W poniższym przykładzie kodu pokazano proste analizowanie ciągów przy użyciu Regex klasy w System.Text.RegularExpressions przestrzeni nazw. Konstruowany jest ciąg zawierający wiele typów delineatorów wyrazów. Ciąg jest następnie analizowany przy użyciu Regex klasy w połączeniu z klasą Match . Następnie każde słowo w zdaniu jest wyświetlane oddzielnie.
Przykład
// 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;
}
Analizowanie ciągów przy użyciu metody Split
W poniższym przykładzie kodu pokazano użycie System.String.Split metody w celu wyodrębnienia każdego wyrazu z ciągu. Ciąg zawierający wiele typów delineatorów wyrazów jest konstruowany, a następnie analizowany przez wywołanie Split za pomocą listy delineatorów. Następnie każde słowo w zdaniu jest wyświetlane oddzielnie.
Przykład
// 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;
}
Używanie wyrażeń regularnych do prostego dopasowywania
Poniższy przykład kodu używa wyrażeń regularnych do wyszukiwania dokładnych dopasowań podciągów. Wyszukiwanie jest wykonywane przez metodę statyczną IsMatch , która przyjmuje dwa ciągi jako dane wejściowe. Pierwszy to wyszukiwany ciąg, a drugi to wzorzec do wyszukania.
Przykład
// 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;
}
Wyodrębnianie pól danych przy użyciu wyrażeń regularnych
W poniższym przykładzie kodu pokazano użycie wyrażeń regularnych do wyodrębniania danych z sformatowanego ciągu. Poniższy przykład kodu używa Regex klasy do określenia wzorca odpowiadającego adresowi e-mail. Ten patter zawiera identyfikatory pól, których można użyć do pobrania części nazwy użytkownika i hosta poszczególnych adresów e-mail. Klasa Match służy do wykonywania rzeczywistego dopasowania wzorca. Jeśli dany adres e-mail jest prawidłowy, nazwa użytkownika i nazwy hostów są wyodrębniane i wyświetlane.
Przykład
// 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;
}
Zmienianie kolejności danych przy użyciu wyrażeń regularnych
W poniższym przykładzie kodu pokazano, jak można użyć obsługi wyrażeń regularnych programu .NET Framework do ponownego rozmieszczania lub ponownego formatowania danych. W poniższym przykładzie kodu użyto Regex klas i Match , aby wyodrębnić imię i nazwisko z ciągu, a następnie wyświetlić te elementy nazwy w odwrotnej kolejności.
Klasa Regex służy do konstruowania wyrażenia regularnego opisującego bieżący format danych. Przyjmuje się, że dwie nazwy są oddzielane przecinkami i mogą używać dowolnej ilości odstępu wokół przecinka. Metoda Match jest następnie używana do analizowania każdego ciągu. Jeśli to się powiedzie, imię i nazwisko są pobierane z Match obiektu i wyświetlane.
Przykład
// 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;
}
Wyszukiwanie i zastępowanie za pomocą wyrażeń regularnych
W poniższym przykładzie kodu pokazano, jak można użyć klasy Regex wyrażeń regularnych do wykonywania wyszukiwania i zastępowania. Odbywa się to za pomocą Replace metody . Używana wersja przyjmuje dwa ciągi jako dane wejściowe: ciąg, który ma zostać zmodyfikowany, i ciąg, który ma zostać wstawiony zamiast sekcji (jeśli istnieją), które pasują do wzorca podanego Regex dla obiektu.
Ten kod zastępuje wszystkie cyfry w ciągu podkreśleniami (_), a następnie zastępuje je pustym ciągiem, co skutecznie je usuwa. Ten sam efekt można osiągnąć w jednym kroku, ale w celach demonstracyjnych są używane dwa kroki.
Przykład
// 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;
}
Używanie wyrażeń regularnych do weryfikowania formatowania danych
W poniższym przykładzie kodu pokazano użycie wyrażeń regularnych w celu zweryfikowania formatowania ciągu. W poniższym przykładzie kodu ciąg powinien zawierać prawidłowy numer telefonu. Poniższy przykład kodu używa ciągu "\d{3}-\d{3}-\d{4}", aby wskazać, że każde pole reprezentuje prawidłowy numer telefonu. Znak "d" w ciągu wskazuje cyfrę, a argument po każdym "d" wskazuje liczbę cyfr, które muszą być obecne. W takim przypadku liczba musi być oddzielona kreskami.
Przykład
// 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;
}
Sekcje pokrewne
Wyrażenia regularne programu .NET Framework
Zobacz też
Programowanie .NET w języku C++/interfejsie wiersza polecenia (Visual C++)