14 Haziran 2017 Çarşamba

smatch Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <regex>
smatch aslında match_results sınıfının gerçekleştirimi.
smatch std::string için kullanılır. cmatch ise char için kullanılır.

Sınıf tüm eşleşmeyi ve yakalanan grupları saklar. regex_search veya regex_match ile kullanılır.
str(), position(), length() gibi metodları vardır. Yakalanan gruplara [1] [2] şeklinde erişilebilir.

operator [0] - tüm eşleşme
smatch[0] tüm eşleşmeyi verir. Çıktı olarak hello ve world alırız.
string str = "hello the3re world";
string exp = "\\b[a-zA-Z]+\\b";
regex r (exp); 

smatch matches;
while (regex_search(str, matches, r)) {
  std::cout << matches[0] << std::endl;
  str = matches.suffix().str();
}
operator [1], operator [1] - yakalama grupları
Elimizde iki tane yakalama grubu olan regex olsun
std::regex r ("...(...),...(...)");
Eşleşme başarılı olsun
std::string const str = "..."

std::smatch matches;
if (std::regex_search(str, matches, r)) {...}
Yakalanan grupları görmek için şöyle yaparız.
std::cout << "..." << matches [1] 
          << "..." << matches [2];
Eğer yakalama grubu 0 veya 1 tane ise şöyle yaparız. Gerçekten yakalama olup olmadığını kontrol etmek için şöyle yaparız.
std::string s = ...;

std::regex re(R"regex((\d+)([GMKgmk]){0,1})regex");
std::smatch match;
bool matched = std::regex_match(s, match, re);
if(!matched) {
  throw ...;
}
if (match[2].matched)
{
  switch (match[2].str().at(0))
  {
    case 'G':
    case 'g':
      std::stoul(match[1].str()) * G);
      break;
    ...
  }
}
suffix metodu
Eşleşme bittikten sonra arkadan kalan kısmı verir. Şöyle yaparız.
std::string str = ...
std::match_results< std::string::const_iterator > what;

std::regex regex = ...;

while( std::regex_search (str, what, regex ) ){
  str = what.suffix().str();
  ...
}


Hiç yorum yok:

Yorum Gönder