自C++11起標準庫提供了正則表達式庫,容許咱們使用通配符和pattern來查找和替換掉string中的字符.ios
Match: 將整個string拿來匹配某個regex.web
Search: 查找某個string中與regex吻合的部分.正則表達式
Replace: 將與正則表達式吻合的第一個(或者後續全部的)子序列替換掉.瀏覽器
Tokenize: 切分即經過指定來切分出來咱們感興趣的正則表達式匹配到的內容.函數
那麼咱們來看一個例子吧,先不用管正則表達式的文法:spa
#include <iostream> #include <regex> #include <string> #include <utility> int main() { std::regex regOne("<.*>.*<.*>"); std::string str("<tg>value</tag>"); std::smatch resultOne; bool booleanOne = std::regex_match(str, resultOne, regOne); std::cout << std::boolalpha << booleanOne << std::endl; std::smatch resultTwo; bool booleanTwo = std::regex_search(str, resultTwo, regOne); std::cout << std::boolalpha << booleanTwo << std::endl; return 0; }
std::regex_match()檢查是否整個字符序列匹配某個正則表達式.code
std::regex_search()檢查是否部分字符序列匹配某個正則表達式.對象
std::basic_regexip
template <typename charT, typename traits = regex_traits<charT> > class basic_regex;
其中咱們上面使用的std::regex其實就是一個: typedef std::basic_regex<char> regex;ci
此外官方還特例化了一個std::wregex實際上是: typedef std::basic_regex<w_char> wregex;
咱們在構造 std::basic_regex對象的時候除了給出必須給出的正則表達式外海能夠指定要給flag:
該flag是個可選的參數,默認值爲 ECMAScript(使用的是ECMA-262規範,不少web瀏覽器用的也是這個標準.
//默認構造函數. basic_regex(); //拷貝構造函數. basic_regex (const basic_regex& rgx); //移動構造函數. basic_regex (basic_regex&& rgx) noexcept; //顯式的接受一個C風格字符串的構造函數. explicit basic_regex ( const charT* str, flag_type flags = ECMAScript ); //接受一個C風格的字符串前len個字符做爲參數構造一個std::basic_regex對象. basic_regex ( const charT* str, size_t len, flag_type flags = ECMAScript ); //接受一個std::basic_string. template <class ST, class SA> explicit basic_regex ( const basic_string<charT,ST,SA>& str, flag_type flags = ECMAScript ); //接受一對迭代器範圍內的字符. template <class ForwardIterator> basic_regex (ForwardIterator first, ForwardIterator last, flag_type flags = ECMAScript ); //接受一個{}括住的字符列表. basic_regex (initializer_list<charT> il, flag_type flags = ECMAScript );
經過上面的構造函數(拷貝構造函數和移動構造函數除外)咱們發現默認的flag都是ECMAScript.
全部的flag都定義在命名空間: std::regex_constants中.
如下均屬於: syntax_option_type類型,其實也就是定義在std::regex_constants這個namespace中的enum類型.
std::regex_constants::icase :該flag支持在正則表達式匹配過程當中忽略大小寫.
std::regex_constants::nosubs :表flag代表在匹配過程當中不保存匹配的子表達式.
std::regex_constants::optimize :代表正則表達式匹配時候執行速度優於構造速度.
std::regex_constants::ECMAScript : 使用ECMA-262指定的語法.
std::regex_constants::extended : 使用POSIX擴展的正則表達式語法.
std::regex_constants::basic : 使用POSIX的基本正則表達式語法.
std::regex_constants::awk : 使用POSIX版本的awk語言的語法.
std::regex_constants::grep : 使用POSIX版本的grep的語法.
std::regex_constants::egrep : 使用POSIX版本的egrep的語法.
std::basic_regex有幾個成員函數讓咱們來看看:
std::basic_regex::assign
//等同於拷貝構造函數. basic_regex& assign( const basic_regex& other ); //等同於移動構造函數. basic_regex& assign( basic_regex&& that ); //接受一個C風格的字符串和flag用來構造一個std::basic_regex對象. basic_regex& assign( const CharT* s, flag_type f = std::regex_constants::ECMAScript ); //接受一個c風格的字符串的前count個字符用來構造一個std::basic_regex對象. basic_regex& assign( const charT* ptr, size_t count, flag_type f = std::regex_constants::ECMAScript ); //接受一個std::basic_string和一個flag用來構造. template< class ST, class SA > basic_regex& assign( const std::basic_string<CharT,ST,SA>& str, flag_type f = std::regex_constants::ECMAScript ); //接受一對 iterator範圍內的字符用來構造. template< class InputIt > basic_regex& assign( InputIt first, InputIt last, flag_type f = std::regex_constants::ECMAScript ); //接受一個{}括着的字符列表用來構造. template<typename charT> basic_regex& assign( std::initializer_list<CharT> ilist, flag_type f = std::regex_constants::ECMAScript );
std::basic_regex::mark_count
unsigned mark_count() const;
返回正則表達式中子表達式的數目.
std::basic_regex::flags
flag_type flags() const;
返回正則表達式中的flags。
Demo for std::basic_regex
#include <iostream> #include <regex> #include <string> #include <utility> int main() { std::string str("<person>value</person>"); std::basic_regex<char> regex("<(.*)>.*</.*>", std::regex_constants::icase | std::regex_constants::ECMAScript); std::cout << regex.mark_count() << std::endl; std::match_results<std::string::const_iterator> result; bool boolean = std::regex_search(str, result, regex); std::cout << std::boolalpha << "是否匹配成功: " << boolean << " " << regex.mark_count() << std::endl; std::cout << result[0].str() << std::endl; return 0; }