1 Ağustos 2017 Salı

std::regex_iterator

Giriş
Şu satırı dahil ederiz.
#include <regex>
regex_search ile yapılan işi iterator kullanarak gerçekleştirir. 

Açıklaması şöyle. regex_token_iterator'den farklı olarak sadece yakaladıklarını döndürür. regex_token_iterator eşleşen ve eşleşmeyen kısımlar erişim sağlıyor.
std::regex_iterator is a read-only ForwardIterator that accesses the individual matches of a regular expression within the underlying character sequence.
Tekrar eden düzenli ifadeleri yakalamak için kullanılır. Açıklaması şöyle
(something)+ will only capture the first occurrence of something, not all of them. The right way to solve this problem is to write a regex that matches a single pair, and apply it repeatedly, e.g. via std::regex_iterator.

Constructor
Şöyle yaparız.
std::string str = ...;
std::regex regex = ...;

auto it = std::sregex_iterator(str.begin(), str.end(), regex);
operator * metodu
Eşleşme grubuna erişmek için şöyle yaparız.
std::regex regex(R"(#.*|(\w+:\w+))");
std::string str = "AA:BB CC:DD EE:FF #this is a comment XX:YY";
for(std::sregex_iterator i = std::sregex_iterator(str.begin(), str.end(), regex);
    i != std::sregex_iterator();
    ++i)
{
  std::smatch m = *i;
  std::cout << m[1].str() << '\n';
}
position metodu
position() ve str() metodları ile eşleşmenin pozisyonunu ve eşleşmeyi alırız. Şöyle kullanırız.
regex rx("(2|25)");
string s = "2225";
for (sregex_iterator it(s.begin(), s.end(), rx), end; it != end; ++it) {
    cout << it->position() << ": " << it->str() << endl;
}
Çıktı olarak şunu alırız.
0: 2
1: 2
2: 25
str metodu
Şöyle yaparız.
std::string str = ...;
std::regex regex = ...;

for(auto it = std::sregex_iterator(str.begin(), str.end(), regex);
  it != std::sregex_iterator();++it)
{
  std::cout<<it->str()<<std::endl;
}

Hiç yorum yok:

Yorum Gönder