Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Демонстрирует различные строковые операции с помощью классов регулярных выражений в платформе .NET Framework.
В следующих разделах демонстрируется использование пространства имен System.Text.RegularExpressions платформы .NET Framework (и в одном случае метода System.String.Split) для поиска, анализа и изменения строк.
Анализ строк с помощью регулярных выражений
В следующем примере кода показан простой анализ строк с помощью класса Regex в пространстве имен System.Text.RegularExpressions. Строка, содержащая несколько типов разделителей слов, создается. Затем строка анализируется с помощью Regex класса в сочетании с классом Match . Затем каждое слово в предложении отображается отдельно.
Пример
// 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
В следующем примере кода показано использование System.String.Split метода для извлечения каждого слова из строки. Строка, содержащая несколько типов делайнаторов слов, создается, а затем анализируется путем вызова Split со списком делайнаторов. Затем каждое слово в предложении отображается отдельно.
Пример
// 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;
}
Использование регулярных выражений для простого сопоставления
В следующем примере кода используются регулярные выражения для поиска точных совпадений подстроки. Поиск выполняется статическим IsMatch методом, который принимает две строки в качестве входных данных. Первое — это строка для поиска, а второй — шаблон для поиска.
Пример
// 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;
}
Использование регулярных выражений для извлечения полей данных
В следующем примере кода показано использование регулярных выражений для извлечения данных из форматируемой строки. В следующем примере кода класс используется Regex для указания шаблона, соответствующего адресу электронной почты. Этот шаблон содержит идентификаторы полей, которые можно использовать для извлечения частей имени пользователя и имени хоста каждого адреса электронной почты. Класс Match используется для выполнения фактического сопоставления шаблонов. Если указанный адрес электронной почты действителен, имя пользователя и имена узлов извлекаются и отображаются.
Пример
// 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;
}
Использование регулярных выражений для изменения порядка данных
В следующем примере кода показано, как можно использовать поддержку регулярных выражений платформа .NET Framework для переупорядочения или переформатации данных. В следующем примере кода используются классы Regex и Match для извлечения имён и фамилий из строки, а затем отобразить эти элементы имени в обратном порядке.
Класс Regex используется для создания регулярного выражения, описывающего текущий формат данных. Предполагается, что эти два имени разделены запятыми и могут использовать любое количество пробелов вокруг запятой. Затем Match метод используется для анализа каждой строки. Если успешно, имена и фамилии извлекаются из объекта Match и отображаются.
Пример
// 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;
}
Использование регулярных выражений для поиска и замены
В следующем примере кода показано, как можно использовать класс Regex регулярных выражений для выполнения поиска и замены. Это делается методом Replace. Версия, используемая в качестве входных данных, принимает две строки: строку, которую необходимо изменить, и строку, которую необходимо вставить вместо разделов (если есть), которые соответствуют шаблону, заданному объекту Regex .
Этот код заменяет все цифры в строке символами подчеркивания (_), а затем заменяет их пустой строкой, эффективно удаляя их. Один и тот же эффект можно выполнить на одном шаге, но два шага используются здесь для демонстрационных целей.
Пример
// 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;
}
Использование регулярных выражений для проверки форматирования данных
В следующем примере кода показано использование регулярных выражений для проверки форматирования строки. В следующем примере кода строка должна содержать допустимый номер телефона. В следующем примере кода используется строка "\d{3}-\d-\d{3}{4}", чтобы указать, что каждое поле представляет допустимый номер телефона. Значение "d" в строке указывает цифру, а аргумент после каждого "d" указывает количество цифр, которые должны присутствовать. В этом случае число должно быть разделено дефисом.
Пример
// 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;
}
Связанные разделы
Регулярные выражения в .NET Framework