C++?Boost?Xpressive示例分析使用
一、綜述
與 Boost.Regex 一樣,Boost.Xpressive 提供了使用正則表達(dá)式搜索字符串的函數(shù)。然而,Boost.Xpressive 使得將正則表達(dá)式寫(xiě)成 C++ 代碼而不是字符串成為可能。這使得在編譯時(shí)檢查正則表達(dá)式是否有效成為可能。
只有 Boost.Regex 被合并到 C++11 中。標(biāo)準(zhǔn)庫(kù)不支持將正則表達(dá)式編寫(xiě)為 C++ 代碼。
boost/xpressive/xpressive.hpp 提供對(duì) Boost.Xpressive 中大多數(shù)庫(kù)函數(shù)的訪問(wèn)。對(duì)于某些函數(shù),必須包含額外的頭文件。該庫(kù)的所有定義都可以在命名空間 boost::xpressive 中找到。
二、應(yīng)用示例
2.1 示例 9.1
boost::xpressive::regex_match 比較字符串
示例 9.1使用 boost::xpressive::regex_match 比較字符串。
#include <boost/xpressive/xpressive.hpp>
#include <string>
#include <iostream>
using namespace boost::xpressive;
int main()
{
std::string s = "Boost Libraries";
sregex expr = sregex::compile("\\w+\\s\\w+");
std::cout << std::boolalpha << regex_match(s, expr) << '\n';
}Boost.Xpressive 基本上提供了與 Boost.Regex 相同的功能,只是它們是在 Boost.Xpressive 的命名空間中定義的。 boost::xpressive::regex_match() 比較字符串,boost::xpressive::regex_search() 搜索字符串,boost::xpressive::regex_replace() 替換字符串中的字符。您可以在示例 9.1 中看到這一點(diǎn),它使用函數(shù) boost::xpressive::regex_match(),并且看起來(lái)類(lèi)似于示例 8.1。
但是,Boost.Xpressive 和 Boost.Regex 之間存在根本區(qū)別。 Boost.Xpressive 中正則表達(dá)式的類(lèi)型取決于被搜索字符串的類(lèi)型。因?yàn)?s 基于示例 9.1 中的 std::string,所以正則表達(dá)式的類(lèi)型必須是 boost::xpressive::sregex。將此與示例 9.2 進(jìn)行比較,其中正則表達(dá)式應(yīng)用于類(lèi)型為 const char* 的字符串
2.2 示例 9.2
boost::xpressive::cregex 類(lèi)型為 const char* 的字符串
#include <boost/xpressive/xpressive.hpp>
#include <iostream>
using namespace boost::xpressive;
int main()
{
const char *c = "Boost Libraries";
cregex expr = cregex::compile("\\w+\\s\\w+");
std::cout << std::boolalpha << regex_match(c, expr) << '\n';
}對(duì)于 const char* 類(lèi)型的字符串,請(qǐng)使用類(lèi) boost::xpressive::cregex。如果您使用其他字符串類(lèi)型,例如 std::wstring 或 const wchar_t*,請(qǐng)使用 boost::xpressive::wsregex 或 boost::xpressive::wcregex。
對(duì)于以字符串形式編寫(xiě)的正則表達(dá)式,您必須調(diào)用靜態(tài)成員函數(shù) compile()。成員函數(shù)必須在用于正則表達(dá)式的類(lèi)型上調(diào)用。
Boost.Xpressive 支持以 C++ 代碼編寫(xiě)的正則表達(dá)式的直接初始化。正則表達(dá)式必須以 Boost.Xpressive 支持的符號(hào)表示(參見(jiàn)示例 9.3)。
2.3 示例 9.3
帶有 C++ 代碼的正則表達(dá)式
#include <boost/xpressive/xpressive.hpp>
#include <string>
#include <iostream>
using namespace boost::xpressive;
int main()
{
std::string s = "Boost Libraries";
sregex expr = +_w >> _s >> +_w;
std::cout << std::boolalpha << regex_match(s, expr) << '\n';
}示例 9.2 中的正則表達(dá)式寫(xiě)為字符串“\w+\s\w+”,現(xiàn)在在示例 9.3 中表示為 +_w >> _s >> +_w。它是完全相同的正則表達(dá)式。這兩個(gè)示例都搜索至少一個(gè)字母數(shù)字字符,后跟一個(gè)空格,然后搜索至少一個(gè)字母數(shù)字字符。
Boost.Xpressive 使使用 C++ 代碼編寫(xiě)正則表達(dá)式成為可能。該庫(kù)為字符組提供對(duì)象。例如,對(duì)象 _w 類(lèi)似于“\w”。 _s 與“\s”的含義相同。
雖然“\w”和“\s”可以在字符串中一個(gè)接一個(gè)地寫(xiě)入,但像_w和_s這樣的對(duì)象必須與運(yùn)算符連接。否則,結(jié)果將不是有效的 C++ 代碼。 Boost.Xpressive 提供運(yùn)算符 operator>>,在示例 9.3 中使用。
為了表示應(yīng)該找到至少一個(gè)字母數(shù)字字符,_w 以加號(hào)為前綴。雖然正則表達(dá)式的語(yǔ)法要求量詞放在字符組后面——比如“\w+”——但加號(hào)必須放在_w前面。加號(hào)是一元運(yùn)算符,在 C++ 中必須放在對(duì)象前面。
Boost.Xpressive 盡可能多地模擬正則表達(dá)式的規(guī)則,因?yàn)樗鼈兛梢栽?C++ 中模擬。但是,也有限制。例如,問(wèn)號(hào)是正則表達(dá)式中的元字符,表示前面的項(xiàng)目是可選的。由于問(wèn)號(hào)在 C++ 中不是有效的運(yùn)算符,Boost.Xpressive 將其替換為感嘆號(hào)。像“\w?”這樣的符號(hào)使用 Boost.Xpressive 變?yōu)?!_w,因?yàn)楦袊@號(hào)必須加前綴。
Boost.Xpressive 支持可以鏈接到表達(dá)式的動(dòng)作——這是 Boost.Regex 不支持的。
2.4 示例 9.4
將動(dòng)作鏈接到表達(dá)式
#include <boost/xpressive/xpressive.hpp>
#include <boost/xpressive/regex_actions.hpp>
#include <string>
#include <iterator>
#include <iostream>
using namespace boost::xpressive;
int main()
{
std::string s = "Boost Libraries";
std::ostream_iterator<std::string> it{std::cout, "\n"};
sregex expr = (+_w)[*boost::xpressive::ref(it) = _] >> _s >> +_w;
std::cout << std::boolalpha << regex_match(s, expr) << '\n';
}示例 9.4 為 boost::xpressive::regex_match() 返回 true 并將 Boost 寫(xiě)入標(biāo)準(zhǔn)輸出。
您可以將操作鏈接到表達(dá)式。當(dāng)找到相應(yīng)的表達(dá)式時(shí)執(zhí)行一個(gè)動(dòng)作。在示例 9.4 中,表達(dá)式 +_w 鏈接到操作 *boost::xpressive::ref(it) = _。該操作是一個(gè) lambda 函數(shù)。對(duì)象 _ 指的是表達(dá)式找到的字符——在本例中是 s 中的第一個(gè)單詞。相應(yīng)的字符被分配給迭代器 it。因?yàn)樗且粋€(gè)類(lèi)型為 std::ostream_iterator 的迭代器,它已經(jīng)用 std::cout 進(jìn)行了初始化,所以 Boost 被寫(xiě)入標(biāo)準(zhǔn)輸出。
請(qǐng)注意,您必須使用函數(shù) boost::xpressive::ref() 來(lái)包裝迭代器。只有這樣才能將_分配給迭代器。 _ 是 Boost.Xpressive 在命名空間 boost::xpressive 中提供的對(duì)象,通常不能將其分配給 std::ostream_iterator 類(lèi)型的迭代器。因?yàn)閮H當(dāng)使用 +_w 找到字符串“Boost”時(shí)才會(huì)發(fā)生賦值,所以 boost::xpressive::ref() 會(huì)將賦值變成惰性操作。盡管根據(jù) C++ 規(guī)則,附加到 +_w 的方括號(hào)中的代碼會(huì)立即執(zhí)行,但它只能在使用正則表達(dá)式時(shí)才對(duì)迭代器進(jìn)行賦值。因此,*boost::xpressive::ref(it) = _ 不會(huì)立即執(zhí)行。
示例 9.4 包含頭文件 boost/xpressive/regex_actions.hpp。這是必需的,因?yàn)闊o(wú)法通過(guò) boost/xpressive/xpressive.hpp 執(zhí)行操作。
與 Boost.Regex 一樣,Boost.Xpressive 支持迭代器以使用正則表達(dá)式拆分字符串。 boost::xpressive::regex_token_iterator 和 boost::xpressive::regex_iterator 類(lèi)執(zhí)行此操作。也可以將區(qū)域設(shè)置鏈接到正則表達(dá)式以使用全局區(qū)域之外的區(qū)域設(shè)置。
到此這篇關(guān)于C++ Boost Xpressive示例分析使用的文章就介紹到這了,更多相關(guān)C++ Boost Xpressive內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt實(shí)現(xiàn)手動(dòng)切換多種布局的完美方案
通過(guò)點(diǎn)擊程序界面上不同的布局按鈕,使主工作區(qū)呈現(xiàn)出不同的頁(yè)面布局,多個(gè)布局之間可以通過(guò)點(diǎn)擊不同布局按鈕切換,支持的最多的窗口為9個(gè),不同布局下窗口數(shù)隨之變化,這篇文章主要介紹了Qt實(shí)現(xiàn)手動(dòng)切換多種布局的完美方案,需要的朋友可以參考下2024-07-07
C++類(lèi)的定義和對(duì)象的創(chuàng)建詳解
本篇文章重點(diǎn)講解了兩種創(chuàng)建對(duì)象的方式:一種是在棧上創(chuàng)建,形式和定義普通變量類(lèi)似;另外一種是在堆上使用 new 關(guān)鍵字創(chuàng)建,必須要用一個(gè)指針指向它,下面和小編一起來(lái)學(xué)習(xí)下面為文章的內(nèi)容2021-09-09
C++?opencv圖像處理實(shí)現(xiàn)灰度變換示例
這篇文章主要為大家介紹了C++?opencv圖像處理灰度變換的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單反彈球消磚塊游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單反彈球消磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
C語(yǔ)言之函數(shù)返回值與參數(shù)傳遞案例教程
這篇文章主要介紹了C語(yǔ)言之函數(shù)返回值與參數(shù)傳遞案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
VC++實(shí)現(xiàn)通過(guò)API來(lái)查看程序錯(cuò)誤信息的方法
這篇文章主要介紹了VC++實(shí)現(xiàn)通過(guò)API來(lái)查看程序錯(cuò)誤信息的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08
一篇文章帶你了解C語(yǔ)言內(nèi)存對(duì)齊公式
這篇文章主要介紹了C語(yǔ)言內(nèi)存對(duì)齊,包括內(nèi)存對(duì)其的基本概念及用法,以及注意事項(xiàng),并以實(shí)例形式加以說(shuō)明,需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-08-08
C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng)(文件數(shù)據(jù)庫(kù))
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

