Bagikan melalui


Ekspresi Reguler (C++/CLI)

Menunjukkan berbagai operasi string menggunakan kelas ekspresi reguler di .NET Framework.

Topik berikut menunjukkan penggunaan namespace .NET Framework System.Text.RegularExpressions (dan dalam satu kasus System.String.Split metode) untuk mencari, mengurai, dan memodifikasi string.

Mengurai String Menggunakan Ekspresi Reguler

Contoh kode berikut menunjukkan penguraian string sederhana menggunakan Regex kelas di System.Text.RegularExpressions namespace. String yang berisi beberapa jenis delineator kata dibuat. String kemudian diurai menggunakan Regex kelas bersama dengan Match kelas . Kemudian, setiap kata dalam kalimat ditampilkan secara terpisah.

Contoh

// 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;
}

Mengurai String Menggunakan Metode Pemisahan

Contoh kode berikut menunjukkan menggunakan System.String.Split metode untuk mengekstrak setiap kata dari string. String yang berisi beberapa jenis delineator kata dibangun lalu diurai dengan memanggil Split dengan daftar delineator. Kemudian, setiap kata dalam kalimat ditampilkan secara terpisah.

Contoh

// 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;
}

Gunakan Regex untuk Pencocokan Sederhana

Contoh kode berikut menggunakan ekspresi reguler untuk mencari kecocokan substring yang tepat. Pencarian dilakukan dengan metode statis IsMatch , yang mengambil dua string sebagai input. Yang pertama adalah string yang akan dicari, dan yang kedua adalah pola yang akan dicari.

Contoh

// 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;
}

Menggunakan Ekspresi Reguler untuk Mengekstrak Bidang Data

Contoh kode berikut menunjukkan penggunaan ekspresi reguler untuk mengekstrak data dari string yang diformat. Contoh kode berikut menggunakan Regex kelas untuk menentukan pola yang sesuai dengan alamat email. Patter ini mencakup pengidentifikasi bidang yang dapat digunakan untuk mengambil bagian nama pengguna dan host dari setiap alamat email. Kelas Match digunakan untuk melakukan pencocokan pola aktual. Jika alamat email yang diberikan valid, nama pengguna dan nama host akan diekstrak dan ditampilkan.

Contoh

// 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;
}

Gunakan Ekspresi Reguler untuk Menyusun Ulang Data

Contoh kode berikut menunjukkan bagaimana dukungan ekspresi reguler .NET Framework dapat digunakan untuk menyusun ulang, atau memformat ulang data. Contoh kode berikut menggunakan Regex kelas dan Match untuk mengekstrak nama depan dan belakang dari string lalu menampilkan elemen nama ini dalam urutan terbalik.

Kelas Regex ini digunakan untuk membuat ekspresi reguler yang menjelaskan format data saat ini. Kedua nama diasumsikan dipisahkan oleh koma dan dapat menggunakan sejumlah spasi putih di sekitar koma. Metode Match ini kemudian digunakan untuk menganalisis setiap string. Jika berhasil, nama depan dan belakang diambil dari Match objek dan ditampilkan.

Contoh

// 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;
}

Contoh kode berikut menunjukkan bagaimana kelas Regex ekspresi reguler dapat digunakan untuk melakukan pencarian dan penggantian. Ini dilakukan dengan Replace metode . Versi yang digunakan mengambil dua string sebagai input: string yang akan dimodifikasi, dan string yang akan disisipkan sebagai pengganti bagian (jika ada) yang cocok dengan pola yang diberikan ke Regex objek.

Kode ini mengganti semua digit dalam string dengan garis bawah (_) lalu menggantinya dengan string kosong, menghapusnya secara efektif. Efek yang sama dapat dicapai dalam satu langkah, tetapi dua langkah digunakan di sini untuk tujuan demonstrasi.

Contoh

// 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;
}

Gunakan Ekspresi Reguler untuk Memvalidasi Pemformatan Data

Contoh kode berikut menunjukkan penggunaan ekspresi reguler untuk memverifikasi pemformatan string. Dalam contoh kode berikut, string harus berisi nomor telepon yang valid. Contoh kode berikut menggunakan string "\d{3}-\d{3}-\d{4}" untuk menunjukkan bahwa setiap bidang mewakili nomor telepon yang valid. "d" dalam string menunjukkan digit, dan argumen setelah setiap "d" menunjukkan jumlah digit yang harus ada. Dalam hal ini, angka harus dipisahkan dengan tanda hubung.

Contoh

// 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;
}

Regex .NET Framework

Baca juga

Pemrograman .NET dengan C++/CLI (Visual C++)