網站首頁 編程語言 正文
一、綜述
與 Boost.Regex 一樣,Boost.Xpressive 提供了使用正則表達式搜索字符串的函數(shù)。然而,Boost.Xpressive 使得將正則表達式寫成 C++ 代碼而不是字符串成為可能。這使得在編譯時檢查正則表達式是否有效成為可能。
只有 Boost.Regex 被合并到 C++11 中。標準庫不支持將正則表達式編寫為 C++ 代碼。
boost/xpressive/xpressive.hpp 提供對 Boost.Xpressive 中大多數(shù)庫函數(shù)的訪問。對于某些函數(shù),必須包含額外的頭文件。該庫的所有定義都可以在命名空間 boost::xpressive 中找到。
二、應用示例
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 中看到這一點,它使用函數(shù) boost::xpressive::regex_match(),并且看起來類似于示例 8.1。
但是,Boost.Xpressive 和 Boost.Regex 之間存在根本區(qū)別。 Boost.Xpressive 中正則表達式的類型取決于被搜索字符串的類型。因為 s 基于示例 9.1 中的 std::string,所以正則表達式的類型必須是 boost::xpressive::sregex。將此與示例 9.2 進行比較,其中正則表達式應用于類型為 const char* 的字符串
2.2 示例 9.2
boost::xpressive::cregex 類型為 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';
}
對于 const char* 類型的字符串,請使用類 boost::xpressive::cregex。如果您使用其他字符串類型,例如 std::wstring 或 const wchar_t*,請使用 boost::xpressive::wsregex 或 boost::xpressive::wcregex。
對于以字符串形式編寫的正則表達式,您必須調用靜態(tài)成員函數(shù) compile()。成員函數(shù)必須在用于正則表達式的類型上調用。
Boost.Xpressive 支持以 C++ 代碼編寫的正則表達式的直接初始化。正則表達式必須以 Boost.Xpressive 支持的符號表示(參見示例 9.3)。
2.3 示例 9.3
帶有 C++ 代碼的正則表達式
#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 中的正則表達式寫為字符串“\w+\s\w+”,現(xiàn)在在示例 9.3 中表示為 +_w >> _s >> +_w。它是完全相同的正則表達式。這兩個示例都搜索至少一個字母數(shù)字字符,后跟一個空格,然后搜索至少一個字母數(shù)字字符。
Boost.Xpressive 使使用 C++ 代碼編寫正則表達式成為可能。該庫為字符組提供對象。例如,對象 _w 類似于“\w”。 _s 與“\s”的含義相同。
雖然“\w”和“\s”可以在字符串中一個接一個地寫入,但像_w和_s這樣的對象必須與運算符連接。否則,結果將不是有效的 C++ 代碼。 Boost.Xpressive 提供運算符 operator>>,在示例 9.3 中使用。
為了表示應該找到至少一個字母數(shù)字字符,_w 以加號為前綴。雖然正則表達式的語法要求量詞放在字符組后面——比如“\w+”——但加號必須放在_w前面。加號是一元運算符,在 C++ 中必須放在對象前面。
Boost.Xpressive 盡可能多地模擬正則表達式的規(guī)則,因為它們可以在 C++ 中模擬。但是,也有限制。例如,問號是正則表達式中的元字符,表示前面的項目是可選的。由于問號在 C++ 中不是有效的運算符,Boost.Xpressive 將其替換為感嘆號。像“\w?”這樣的符號使用 Boost.Xpressive 變?yōu)?!_w,因為感嘆號必須加前綴。
Boost.Xpressive 支持可以鏈接到表達式的動作——這是 Boost.Regex 不支持的。
2.4 示例 9.4
將動作鏈接到表達式
#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 寫入標準輸出。
您可以將操作鏈接到表達式。當找到相應的表達式時執(zhí)行一個動作。在示例 9.4 中,表達式 +_w 鏈接到操作 *boost::xpressive::ref(it) = _。該操作是一個 lambda 函數(shù)。對象 _ 指的是表達式找到的字符——在本例中是 s 中的第一個單詞。相應的字符被分配給迭代器 it。因為它是一個類型為 std::ostream_iterator 的迭代器,它已經用 std::cout 進行了初始化,所以 Boost 被寫入標準輸出。
請注意,您必須使用函數(shù) boost::xpressive::ref() 來包裝迭代器。只有這樣才能將_分配給迭代器。 _ 是 Boost.Xpressive 在命名空間 boost::xpressive 中提供的對象,通常不能將其分配給 std::ostream_iterator 類型的迭代器。因為僅當使用 +_w 找到字符串“Boost”時才會發(fā)生賦值,所以 boost::xpressive::ref() 會將賦值變成惰性操作。盡管根據(jù) C++ 規(guī)則,附加到 +_w 的方括號中的代碼會立即執(zhí)行,但它只能在使用正則表達式時才對迭代器進行賦值。因此,*boost::xpressive::ref(it) = _ 不會立即執(zhí)行。
示例 9.4 包含頭文件 boost/xpressive/regex_actions.hpp。這是必需的,因為無法通過 boost/xpressive/xpressive.hpp 執(zhí)行操作。
與 Boost.Regex 一樣,Boost.Xpressive 支持迭代器以使用正則表達式拆分字符串。 boost::xpressive::regex_token_iterator 和 boost::xpressive::regex_iterator 類執(zhí)行此操作。也可以將區(qū)域設置鏈接到正則表達式以使用全局區(qū)域之外的區(qū)域設置。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127296944
相關推薦
- 2023-03-29 詳解C++中菱形繼承的原理與解決方法_C 語言
- 2021-12-07 Centos8搭建基于kdc加密的nfs_Linux
- 2022-08-30 android屏幕適配sw規(guī)則
- 2023-11-21 linux sudo:/etc/sudoers 中第 11 行附近有解析錯誤 sudo:no val
- 2022-04-01 Prometheus處理metrics標簽
- 2022-06-30 python神經網絡ResNet50模型的復現(xiàn)詳解_python
- 2022-09-25 Identity Server4/生產模式/證書/certificate/AddSigningCre
- 2022-08-22 詳解Go語言中for循環(huán),break和continue的使用_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支