3 Mart 2020 Salı

std::regex Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <regex>
Constructor - type
İmzası şöyle
basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
Gramer olarak ECMAScript, basic, extended, awk, grep, egrep seçilebilir. Eğer seçilmezse ECMAScript kullanılır. Açıklaması şöyle.
A valid value of type syntax_option_type shall have exactly one of the elements ECMAScriptbasicextendedawkgrepegrep, set.
Örnek - collate
Açıklaması şöyle.
collate Character ranges of the form "[a-b]" will be locale sensitive.
Şöyle yaparız.
std::regex re{"[А-Яа-яЁё]+", std::regex::collate};
Örnek - extended
Şöyle yaparız.
std::regex regex("[.]", std::regex::extended);
Örnek - icase
Şöyle yaparız.
std::regex regex ("...", std::regex::ECMAScript | std::regex::icase);
Örnek- icase
type olarak engine belirtilmiyor. Şöyle yaparız.
std::string pattern= "...";
std::regex regex (pattern,std::regex_constants::icase);
ECMAScript ve Non Greedy Davranış
Açıklaması şöyle. Yani ? karakteri quantifier'dan sonra gelirse ifade non greedy hale gelir.
The ? is treated differently (i.e., is not the zero-or-one quantifier) when it immediately follows a quantifier (*, +, ?, {exact}, {min,} and {min,max}) in that it makes the matching non-greedy:
Açıklaması şöyle.
By default, all these quantifiers are greedy (i.e., they take as many characters that meet the condition as possible). This behavior can be overridden to ungreedy (i.e., take as few characters that meet the condition as possible) by adding a question mark, ?, after the quantifier.
For example, matching "(a+).*" against "aardvark" succeeds and yields aa as the first submatch, while matching "(a+?).*" against it also succeeds, but yields a as the first submatch.
Örnek
İki tag arasındaki metini yakalamak için şöyle yaparız.
std::string html = "<ul><a href=\"http://stackoverflow.com\">SO</a></ul> "
                      "<ul>abc</ul>\n";
std::regex url_re(R"(<ul>([\s\S]*?)<\/ul>)", std::regex::icase);
std::copy( std::sregex_token_iterator(html.begin(), html.end(), url_re, 1),
           std::sregex_token_iterator(),
           std::ostream_iterator<std::string>(std::cout, "\n"));


Hiç yorum yok:

Yorum Gönder