网站多语言建设,使用爬虫做的网站,新工商名录,妙趣网 通辽网站建设正则表达式库regex 一、概述二、快速上手Demo1. 查找字符串2. 匹配字符串3. 替换字符串 三、类关系梳理1. 主类1. basic_regex 2. 算法1. regex_match2. regex_search3. regex_replace 3. 迭代器4. 异常5. 特征6. 常量1. syntax_option_type2. match_flag_type3. error_type 一… 正则表达式库regex 一、概述二、快速上手Demo1. 查找字符串2. 匹配字符串3. 替换字符串 三、类关系梳理1. 主类1. basic_regex 2. 算法1. regex_match2. regex_search3. regex_replace 3. 迭代器4. 异常5. 特征6. 常量1. syntax_option_type2. match_flag_type3. error_type 一、概述
C标准库为我们提供了处理字符串的正则表达式库。正则表达式是一种用于在字符串中匹配模式的微型语言。
正则表达式在查询、替换字符串的时候有很多快速的使用场景是一个经常使用的工具。正则表达式需要使用到正则表达式的语法这个语法是独立于编程语言外的一个工具。这个可以 在线查看和测试
菜鸟学习教程 https://www.runoob.com/regexp/regexp-syntax.html
在线测试工具 https://stackoverflow.org.cn/regex/
这个用到的头文件便是
#include regex二、快速上手Demo
1. 查找字符串
1. 采用迭代器查找
// 待匹配字符串
std::string s Some people, when confronted with a problem;// 正则表达式匹配对象-匹配单词
std::regex word_regex((\\w));// 获取迭代器
auto words_begin std::sregex_iterator(s.begin(), s.end(), word_regex);
auto words_end std::sregex_iterator();// 总元素个数
int count std::distance(words_begin, words_end);// 遍历元素
for (std::sregex_iterator i words_begin; i ! words_end; i) {// 查询到的匹配对象std::smatch match *i;// 输出这个匹配对象的内容std::string match_str match.str();std::cout match_str \n;
}/* 输出结果
Some
people
when
confronted
with
a
problem
*/2. 使用算法查找
使用 std::regex_search() 查找
//常用
template class BidirIt,class Alloc, class CharT, class Traits
bool regex_search( BidirIt first, BidirIt last,std::match_resultsBidirIt,Alloc m,const std::basic_regexCharT,Traits e,std::regex_constants::match_flag_type flags std::regex_constants::match_default );
//常用
template class CharT, class Alloc, class Traits
bool regex_search( const CharT* str,std::match_resultsconst CharT*,Alloc m,const std::basic_regexCharT,Traits e,std::regex_constants::match_flag_type flags std::regex_constants::match_default );
//常用
template class STraits, class SAlloc,class Alloc, class CharT, class Traits
bool regex_search( const std::basic_stringCharT,STraits,SAlloc s,std::match_resultstypename std::basic_stringCharT,STraits,SAlloc::const_iterator, Alloc m,const std::basic_regexCharT, Traits e,std::regex_constants::match_flag_type flags std::regex_constants::match_default ); template class BidirItclass CharT, class Traits
bool regex_search( BidirIt first, BidirIt last,const std::basic_regexCharT,Traits e,std::regex_constants::match_flag_type flags std::regex_constants::match_default );template class CharT, class Traits
bool regex_search( const CharT* str,const std::basic_regexCharT,Traits e,std::regex_constants::match_flag_type flags std::regex_constants::match_default ); template class STraits, class SAlloc,class CharT, class Traits
bool regex_search( const std::basic_stringCharT,STraits,SAlloc s,const std::basic_regexCharT,Traits e,std::regex_constants::match_flag_type flags std::regex_constants::match_default );template class STraits, class SAlloc,class Alloc, class CharT, class Traits
bool regex_search( const std::basic_stringCharT,STraits,SAlloc,std::match_resultstypename std::basic_stringCharT,STraits,SAlloc::const_iterator, Alloc,const std::basic_regexCharT, Traits,std::regex_constants::match_flag_type flags std::regex_constants::match_default ) delete;
这个函数的部分参数说明
待匹配字符串三种输入 first, last - 标识目标字符序列的范围str - 指向空终止字符序列的指针s - 标识目标字符序列的指针 e - 应当应用到目标字符序列的 std::regex 其实就是正则匹配对象m - 匹配结果 用的是 match_results 对象描述flags - 掌管搜索行为的 std::regex_constants::match_flag_type
// 待匹配字符串
std::string lines[] {Roses are #ff0000,violets are #0000ff,all of my base are belong to you};
// 正则表达式对象
std::regex color_regex(#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2}));
// 匹配结果
std::vectorstd::smatch matchs;// 简单匹配
for (const auto line : lines) {std::smatch m;std::cout line : std::boolalpha std::regex_search(line, m, color_regex) \n;matchs.push_back(m);
}// 输出结果
for(auto m: matchs){if(m.ready() !m.empty())std::cout Useful Color: m.str() \n;
}
/* 输出结果
Roses are #ff0000: true
violets are #0000ff: true
all of my base are belong to you: false
Useful Color: #ff0000
Useful Color: #0000ff
*/2. 匹配字符串
有两个方法都可以去匹配字符串。可以用 regex_match 或者 regex_search
因为 regex_match 只考虑完全匹配故同一 regex 可能在 regex_match 和 std::regex_search 间给出不同的匹配
// 构造正则表达式对象
std::regex re(Get|GetValue);
std::cmatch m;// regex_search 方法
std::regex_search(GetValue, m, re); // 返回 true 且 m[0] 含 Get
std::regex_search(GetValues, m, re); // 返回 true 且 m[0] 含 Get// regex_match 方法
std::regex_match (GetValue, m, re); // 返回 true 且 m[0] 含 GetValue
std::regex_match (GetValues, m, re); // 返回 false3. 替换字符串
#include iostream
#include iterator
#include regex
#include stringint main()
{std::string text Quick brown fox;std::regex vowel_re(a|e|i|o|u);// 写结果到输出迭代器std::regex_replace(std::ostreambuf_iteratorchar(std::cout),text.begin(), text.end(), vowel_re, *);// 等价于下面的// std::cout \n std::regex_replace(text, vowel_re, *);// 构造保有结果的字符串std::cout \n std::regex_replace(text, vowel_re, [$]) \n;
}// 输出
Q**ck br*wn f*x
Q[u][i]ck br[o]wn f[o]x三、类关系梳理
1. 主类
这些类封装正则表达式和在字符的目标序列中匹配正则表达式的结果。
1. basic_regex
basic_regex 正则表达式对象
在源代码里面看到那个 std::regex 对象就是用这个 basic_regex 定义的
/** brief Standard regular expressions. */
typedef basic_regexchar regex;sub_match 标识子表达式所匹配的字符序列
match_results标识一个正则表达式匹配包含所有子表达式匹配
2. 算法
这些算法将封装于 regex 的正则表达式应用到字符的目标序列。
1. regex_match
regex_match尝试匹配一个正则表达式到整个字符序列
2. regex_search
regex_search尝试匹配一个正则表达式到字符序列的任何部分
3. regex_replace
regex_replace以格式化的替换文本来替换正则表达式匹配的出现位置
3. 迭代器
regex_iterator用于遍历在序列中找到的匹配正则表达式的整个集合。
regex_iterator 迭代一个字符序列中的所有正则表达式匹配
regex_token_iterator迭代给定字符串中的所有正则表达式匹配中的指定子表达式或迭代未匹配的子字符串
4. 异常
此类定义作为异常抛出以报告来自正则表达式库错误的类型。
regex_error 报告正则表达式库生成的错误信息 使用这个也是非常简单的
#include regex
#include iostreamint main()
{try {std::regex re([a-b][a);}catch (const std::regex_error e) {std::cout regex_error caught: e.what() \n;// 这个错误码定义在 6.常量.error_type 中if (e.code() std::regex_constants::error_brack) {std::cout The code was error_brack\n;}}
}// 输出
regex_error caught: The expression contained mismatched [ and ].
The code was error_brack5. 特征
regex_traits 类用于封装 regex 的本地化方面。
regex_traits提供正则表达式库所需的关于字符类型的元信息
6. 常量
定义于命名空间 std::regex_constants
1. syntax_option_type
syntax_option_type 控制正则表达式行为的通用选项这个参数是放在 regex 对象构造函数中去设置匹配的
就像这种 std::regex re2(.*(a|xayy), std::regex::extended);constexpr syntax_option_type icase /*unspecified*/;constexpr syntax_option_type nosubs /*unspecified*/;
constexpr syntax_option_type optimize /*unspecified*/;
constexpr syntax_option_type collate /*unspecified*/;
constexpr syntax_option_type ECMAScript /*unspecified*/;
constexpr syntax_option_type basic /*unspecified*/;
constexpr syntax_option_type extended /*unspecified*/;
constexpr syntax_option_type awk /*unspecified*/;
constexpr syntax_option_type grep /*unspecified*/;
constexpr syntax_option_type egrep /*unspecified*/;解释
值效果icase应当以不考虑大小写进行字符匹配。nosubs进行匹配时将所有被标记的子表达式 (expr) 当做非标记的子表达式 (?:expr) 。不将匹配存储于提供的 std::regex_match 结构中且 mark_count() 为零optimize指示正则表达式引擎进行更快的匹配带有令构造变慢的潜在开销。例如这可能表示将非确定 FSA 转换为确定 FSA 。collate形如 “[a-b]” 的字符范围将对本地环境敏感。multiline(C17) 若选择 ECMAScript 引擎则指定 ^ 应该匹配行首而 $ 应该匹配行尾。ECMAScript使用改 ECMAScript 正则表达式文法basic使用基本 POSIX 正则表达式文法文法文档。extended使用扩展 POSIX 正则表达式文法文法文档。awk使用 POSIX 中 awk 工具所用的正则表达式文法文法文档。grep使用 POSIX 中 grep 工具所用的正则表达式文法。这等效于 basic 选项附带作为另一种分隔符的换行符 ‘\n’ 。egrep使用 POSIX 中 grep 工具带 -E 选项所用的正则表达式文法。这等效于 extended 附带 ’
ECMAScript, basic, extended, awk, grep, egrep 必须选取至多一个文法选项。若不选取文法选项则设定为选取 ECMAScript 。其他选项作为修饰符工作从而 std::regex(“meow”, std::regex::icase) 等价于 std::regex(“meow”, std::regex::ECMAScript|std::regex::icase)
注意 因为 POSIX 使用“最左最长”匹配规则最长的匹配子序列得到匹配且若存在数个这种子序列则匹配最左者故它不适用的例子之一是剖析标签语言如 “tag[^].” 这种 POSIX 正则表达式会匹配从首个 “tag” 到最末 “” 的任何内容包含中间的每个 “” 和 “” 。另一方面 ECMAScript 支持非贪心匹配且 ECMAScript 正则表达式 “tag[^].?” 会只匹配到首个闭标签。
下面描述 ECMA 和 POSIX 匹配的区别
#include iostream
#include string
#include regexint main()
{std::string str zzxayyzz;std::regex re1(.*(a|xayy)); // ECMAstd::regex re2(.*(a|xayy), std::regex::extended); // POSIXstd::cout Searching for .*(a|xayy) in zzxayyzz:\n;std::smatch m;std::regex_search(str, m, re1);std::cout ECMA (depth first search) match: m[0] \n;std::regex_search(str, m, re2);std::cout POSIX (leftmost longest) match: m[0] \n;
}// 输出
Searching for .*(a|xayy) in zzxayyzz:
ECMA (depth first search) match: zzxa
POSIX (leftmost longest) match: zzxayy2. match_flag_type
match_flag_type特定于匹配的选项这个是用在 regex_match、regex_search、regex_replace 三个算法函数中的一个参数。
就像下面的 regex_match 函数的 flags 是给的默认值
template class BidirIt,class CharT, class Traits
bool regex_match( BidirIt first, BidirIt last,const std::basic_regexCharT,Traits e,std::regex_constants::match_flag_type flags std::regex_constants::match_default );constexpr match_flag_type match_default {};constexpr match_flag_type match_not_bol /*unspecified*/;
constexpr match_flag_type match_not_eol /*unspecified*/;
constexpr match_flag_type match_not_bow /*unspecified*/;
constexpr match_flag_type match_not_eow /*unspecified*/;
constexpr match_flag_type match_any /*unspecified*/;
constexpr match_flag_type match_not_null /*unspecified*/;
constexpr match_flag_type match_continuous /*unspecified*/;
constexpr match_flag_type match_prev_avail /*unspecified*/;
constexpr match_flag_type format_default {};
constexpr match_flag_type format_sed /*unspecified*/;
constexpr match_flag_type format_no_copy /*unspecified*/;注意 [first, last) 指代要匹配的字符序列。
常量解释match_not_bol[first,last) 中的首个字符将被处理成如同它不在行首即 ^ 将不匹配 [first,first) match_not_eol[first,last) 中的最末字符将被处理成如同它不在行尾即 $ 将不匹配 [last,last) match_not_bow“\b” 将不匹配 [first,first)match_not_eow“\b” 将不匹配 [last,last)match_any若多于一个匹配可行则任何匹配都是可接受的结果match_not_null不匹配空字符序列match_continuous仅匹配始于 first 的子串match_prev_avail–first 是合法的迭代位置。设置时导致 match_not_bol 和 match_not_bow 被忽略format_default使用 ECMAScript 规则于 std::regex_replace 构造字符串语法文档format_sed 于std::regex_replace 使用 POSIX sed 工具规则。语法文档format_no_copy不复制不匹配的字符串到 std::regex_replace 中的输出format_first_only仅替换 std::regex_replace 中的首个匹配
match_default 及 format_default 以外的所有常量都是位掩码元素。 match_default 与 format_default 常量是空位掩码。
3. error_type
error_type描述不同类型的匹配错误可以用 try catch 捕获
constexpr error_type error_collate /*unspecified*/;
constexpr error_type error_ctype /*unspecified*/;
constexpr error_type error_escape /*unspecified*/;
constexpr error_type error_backref /*unspecified*/;
constexpr error_type error_brack /*unspecified*/;
constexpr error_type error_paren /*unspecified*/;
constexpr error_type error_brace /*unspecified*/;
constexpr error_type error_badbrace /*unspecified*/;
constexpr error_type error_range /*unspecified*/;
constexpr error_type error_space /*unspecified*/;
constexpr error_type error_badrepeat /*unspecified*/;
constexpr error_type error_complexity /*unspecified*/;
constexpr error_type error_stack /*unspecified*/;名词解释如下
常量解释error_collate表达式含有非法对照字符名error_ctype表达式含有非法字符类名error_escape表达式含有非法转义字符或尾随转义error_backref表达式含有非法回溯引用error_brack表达式含有不匹配的方括号对 ‘[’ 与 ‘]’ error_paren表达式含有不匹配的括号对 ‘(’ 与 ‘)’ error_brace表达式含有不匹配的花括号对 ‘{’ 与 ‘}’ error_badbrace表达式在 {} 表达式中含有非法范围error_range表达式含有非法字符范围例如 [b-a] error_space没有将表达式转换成有限状态机的足够内存error_badrepeat*?{ 之一不后继一个合法正则表达式error_complexity尝试的匹配的复杂度超过了预定义的等级error_stack没有进行匹配的足够内存