Dela via


Reguljära uttryck (C++/CLI)

Visar olika strängåtgärder med hjälp av reguljära uttrycksklasser i .NET Framework.

Följande avsnitt visar hur .NET Framework-namnområdet System.Text.RegularExpressions (och i ett fall System.String.Split metoden) används för att söka, parsa och ändra strängar.

Parsa strängar med reguljära uttryck

I följande kodexempel visas enkel strängparsning med klassen Regex i System.Text.RegularExpressions namnområdet. En sträng som innehåller flera typer av ordavgränsare konstrueras. Strängen parsas sedan med hjälp av Regex klassen tillsammans med Match klassen. Sedan visas varje ord i meningen separat.

Exempel

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

Parsa strängar med hjälp av delningsmetoden

Följande kodexempel visar hur du använder System.String.Split metoden för att extrahera varje ord från en sträng. En sträng som innehåller flera typer av ordbeskrivningar skapas och parsas sedan genom att anropa Split med en lista över delineatorerna. Sedan visas varje ord i meningen separat.

Exempel

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

Använda reguljära uttryck för enkel matchning

I följande kodexempel används reguljära uttryck för att leta efter exakta delsträngsmatchningar. Sökningen utförs av den statiska IsMatch metoden, som tar två strängar som indata. Den första är strängen som ska sökas igenom, och den andra är det mönster som ska sökas efter.

Exempel

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

Använda reguljära uttryck för att extrahera datafält

I följande kodexempel visas användningen av reguljära uttryck för att extrahera data från en formaterad sträng. I följande kodexempel används Regex klassen för att ange ett mönster som motsvarar en e-postadress. Det här fältet innehåller fältidentifierare som kan användas för att hämta användar- och värdnamnsdelarna för varje e-postadress. Klassen Match används för att utföra den faktiska mönstermatchningen. Om den angivna e-postadressen är giltig extraheras användarnamnet och värdnamnen och visas.

Exempel

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

Använda reguljära uttryck för att ordna om data

Följande kodexempel visar hur stöd för reguljära .NET Framework-uttryck kan användas för att ordna om eller formatera om data. I följande kodexempel används Regex klasserna och Match för att extrahera för- och efternamn från en sträng och sedan visa dessa namnelement i omvänd ordning.

Klassen Regex används för att konstruera ett reguljärt uttryck som beskriver det aktuella formatet för data. De två namnen antas vara avgränsade med ett kommatecken och kan använda valfri mängd blanksteg runt kommatecknet. Metoden Match används sedan för att analysera varje sträng. Om det lyckas hämtas för- och efternamn från Match objektet och visas.

Exempel

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

Följande kodexempel visar hur klassen reguljära uttryck Regex kan användas för att utföra sök- och ersättningsoperationer. Detta görs med Replace metoden . Den version som används tar två strängar som indata: strängen som ska ändras och strängen som ska infogas i stället för de avsnitt (om några) som matchar det mönster som ges till Regex objektet.

Den här koden ersätter alla siffror i en sträng med understreck (_) och ersätter dem sedan med en tom sträng, vilket effektivt tar bort dem. Samma effekt kan åstadkommas i ett enda steg, men två steg används här i demonstrationssyfte.

Exempel

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

Använda reguljära uttryck för att verifiera dataformatering

I följande kodexempel visas användningen av reguljära uttryck för att verifiera formateringen av en sträng. I följande kodexempel ska strängen innehålla ett giltigt telefonnummer. I följande kodexempel används strängen "\d{3}-\d{3}-\d{4}" för att indikera att varje fält representerar ett giltigt telefonnummer. "D" i strängen anger en siffra, och argumentet efter varje "d" anger antalet siffror som måste finnas. I det här fallet måste talet avgränsas med bindestreck.

Exempel

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

Reguljära .NET Framework-uttryck

Se även

.NET-programmering med C++/CLI (Visual C++)