Partilhar via


Expressões regulares (C++/CLI)

Demonstra várias operações de cadeia de caracteres usando classes de expressões regulares no .NET Framework.

Os tópicos a seguir demonstram o uso do namespace System.Text.RegularExpressions do .NET Framework (e, em um caso, o método System.String.Split) para pesquisar, analisar e modificar cadeias de caracteres.

Analisar cadeias de caracteres usando expressões regulares

O exemplo de código a seguir demonstra a análise de cadeia de caracteres simples usando a classe Regex no namespace System.Text.RegularExpressions. Uma cadeia de caracteres que contém vários tipos de delineadores de palavras é construída. Em seguida, a cadeia de caracteres é analisada usando a classe Regex em conjunto com a classe Match. Em seguida, cada palavra na frase é exibida separadamente.

Exemplo

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

Analisar cadeias de caracteres usando o método split

O exemplo de código a seguir demonstra o uso do método System.String.Split para extrair cada palavra de uma cadeia de caracteres. Uma cadeia de caracteres que contém vários tipos de delineadores de palavras é construída e analisada chamando Split com uma lista dos delineadores. Em seguida, cada palavra na frase é exibida separadamente.

Exemplo

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

Como usar expressões regulares para correspondência simples

O exemplo de código a seguir usa expressões regulares para procurar correspondências exatas de substring. A pesquisa é executada pelo método estático IsMatch, que usa duas cadeias de caracteres como entrada. A primeira é a cadeia de caracteres a ser pesquisada e a segunda é o padrão a ser pesquisado.

Exemplo

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

Usar expressões regulares para extrair campos de dados

O exemplo de código a seguir demonstra o uso de expressões regulares para extrair dados de uma cadeia de caracteres formatada. O exemplo de código a seguir usa a classe Regex para especificar um padrão que corresponde a um endereço de email. Esse padrão inclui identificadores de campo que podem ser usados para recuperar as partes do nome do usuário e do host de cada endereço de email. A classe Match é usada para executar a correspondência de padrões real. Se o endereço de email fornecido for válido, os nomes de nome de usuário e de host serão extraídos e exibidos.

Exemplo

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

Usar expressões regulares para reorganizar dados

O exemplo de código a seguir demonstra como o suporte à expressão regular do .NET Framework pode ser usado para reorganizar ou reformatar dados. O exemplo de código a seguir usa as classes Regex e Match para extrair nomes e sobrenomes de uma cadeia de caracteres e, em seguida, exibir esses elementos de nome em ordem inversa.

A classe Regex é usada para construir uma expressão regular que descreve o formato atual dos dados. Os dois nomes são presumidamente separados por uma vírgula e podem usar qualquer quantidade de espaço em branco em torno da vírgula. Em seguida, o método Match é usado para analisar cada cadeia de caracteres. Se tiver êxito, o nome e o sobrenome serão recuperados do objeto Match e exibidos.

Exemplo

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

O exemplo de código a seguir demonstra como a classe de expressão regular Regex pode ser usada para pesquisar e substituir. Isso é feito com o método Replace. A versão utilizada usa duas cadeias de caracteres como entrada: a cadeia de caracteres a ser modificada e a cadeia de caracteres a ser inserida no lugar das seções (se houver) que correspondem ao padrão fornecido ao objeto Regex.

Esse código substitui todos os dígitos em uma cadeia de caracteres por sublinhados (_) e, em seguida, substitui-os por uma cadeia de caracteres vazia, removendo-os efetivamente. O mesmo efeito pode ser obtido com apenas uma etapa, mas duas etapas são usadas aqui para fins de demonstração.

Exemplo

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

Usar expressões regulares para validar a formatação de dados

O exemplo de código a seguir demonstra o uso de expressões regulares para verificar a formatação de uma cadeia de caracteres. No exemplo de código a seguir, a cadeia de caracteres deve conter um número de telefone válido. O exemplo de código a seguir usa a cadeia de caracteres "\d{3}-\d{3}-\d{4}" para indicar que cada campo representa um número de telefone válido. O "d" na cadeia de caracteres indica um dígito e o argumento após cada "d" indica o número de dígitos que precisam estar presentes. Nesse caso, é necessário que o número seja separado por traços.

Exemplo

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

Expressões regulares do .NET Framework

Confira também

Programação do .NET com C++/CLI (Visual C++)