wyrazenia_regularne.cpp

/** plik prezentuje podstawy programowania obiektowego w C++ :
  *  korzystanie z wyrażeń regularnych
  *
  *  kompilacja: gcc -lboost_regex-mt wyrazenia_regularne.cpp
  **/

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main() {
  static const boost::regex wyrazenie1("(.*)(ko*t).*");
  static const boost::regex wyrazenie2("(ko*t)");
  static const boost::regex wyrazenie3("(ko.*?) ");
  // dodanie ? w tym wyrazeniu powoduje jego niezachlanne dzialanie
  // (dopasowuje najmniej jak sie da)
  static const boost::regex wyrazenie4(" +");
  
  boost::match_results<std::string::const_iterator> dopasowania;
  std::string napis1 = "Ala ma koooota";
  std::string napis2 = "Kot ma Ale ...";
  std::string napis3 = "kot psu kotem a kotowi psem";
  
  /* sprawdzanie czy pasuje */
  if (regex_match(napis1, dopasowania, wyrazenie1)) {
    std::cout << "napis1 pasuje" << std::endl;
    std::cout << " dopasowany napis to \"" << dopasowania[0];
    // w kolejnych elementach dopasowania znajdują się napisyy odpowiadające dopasowanym podwyrażenim
    std::cout << "\" a pierwsze podwyrazenie ma wartość \""  << dopasowania[1] << "\"" << std::endl;
  } else
    std::cout << "napis1 nie pasuje" << std::endl;
  
  if (regex_match(napis2, wyrazenie1))
    std::cout << "napis2 pasuje" << std::endl;
  else
    std::cout << "napis2 nie pasuje" << std::endl;
  
  /* wyszukiwanie */
  std::string::const_iterator poczatek = napis3.begin();
  std::string::const_iterator koniec = napis3.end();
  while (boost::regex_search(poczatek, koniec, dopasowania, wyrazenie3)) {
    std::cout << "Znalazlem: " << dopasowania[1] << "X" << std::endl;
    // tutaj podobnie jak wczesniej w 0 mamy cale dopasowane wyrazenie
    // a w kolejnych [] odpowiednie podwyrazenia
    
    // ustawiamy poczatek szukania na jeden znak dalej niz koniec znaleznionego tekstu
    poczatek = dopasowania[0].second;
  }
  
  // możemy także uzyć iteratorow sregx
  boost::sregex_iterator begin(napis3.begin(), napis3.end(), wyrazenie3);
  boost::sregex_iterator end;
  while (begin != end){
    dopasowania = *begin;
    std::cout << "Znalazlem: " << dopasowania[1] << " X " << (*begin)[1] << std::endl;
    begin++;
  }
  
  /* zastępowywanie */
  napis1=regex_replace(napis1, wyrazenie2, "psa i \\1");
  std::cout << "Teraz: " << napis1 << std::endl;
  
  /* dzielenie */
  boost::sregex_token_iterator i(napis3.begin(), napis3.end(), wyrazenie4, -1);
  boost::sregex_token_iterator j;
  while(i != j) {
    std::cout << "Wydzielilem: " << *i++ << std::endl;
  }
  
  // w boost są także inne implementacje wyrażeń regularnych - w tym umożliwiające
  // tworzenie wyrażeń na etapie kompilacji oraz operowanie bardziej złożonymi gramatykami
}

XHTML generated by highlight (http://www.andre-simon.de/) from wyrazenia_regularne.cpp



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/c_cpp/wyrazenia_regularne.cpp) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:41 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).