정규식(C++/CLI)
.NET Framework에서 정규식 클래스를 사용하는 다양한 문자열 작업을 보여 줍니다.
다음 항목에서는 .NET Framework System.Text.RegularExpressions 네임스페이스(그리고 한 경우 System.String.Split 메서드)를 사용하여 문자열을 검색, 구문 분석 및 수정하는 방법을 보여 줍니다.
정규식을 사용하여 문자열 구문 분석
다음 코드 예제에서는 네임스페이스의 클래스 System.Text.RegularExpressions 를 사용하여 Regex 간단한 문자열 구문 분석을 보여 줍니다. 여러 형식의 단어 설명자를 포함하는 문자열이 생성됩니다. 그런 다음 클래스와 함께 클래스를 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 정규식 지원을 사용하여 데이터를 다시 정렬하거나 다시 포맷하는 방법을 보여 줍니다. 다음 코드 예제에서는 및 Match 클래스를 사용하여 Regex 문자열에서 이름과 성을 추출한 다음 이러한 이름 요소를 역순으로 표시합니다.
이 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;
}