Regex C++: 正則表達式(1)

自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;
}
相關文章
相關標籤/搜索