赞
踩
头文件:#include<regex>
.
:换行符以外的任何字符[...]
:…字符中的任何一个[^...]
:…字符之外的任何一个[[:charclass:]]
:指定之字符类charclass中的一个\n, \t, \f, \r, \v
:换行符,tab符号,还有。。。\xhh, \uhhh
:一个十六进制字符或unicode字符\d, \D
:一个数字,一个非数字\s, \S
:一个空白字符,一个非空白字符\w, \W
:字母,数字,下划线;\S正好相反,不是字母,数字,下划线*
:匹配0次或多次?
:0次或一次+
:至少一次{n}
:n次{n, m}
:至少n次,至多m次,如果省略m,则没有上限...|...
: 匹配|之前或之后的(...)
:设定分组,如果前面已有分组,可以使用"\1"再次指代它。在C++11之前需要用"\1",C++11可以用新的写法:R"…\1"\number
: 如:\1, \2, \3
:表示第n个分组^
:一行的起点$
:一行的终点一个正则表达式的语法是否正确是在运行时解析的
Type | Definition |
---|---|
std::cmatch | std::match_results<const char*> |
std::wcmatch | std::match_results<const wchar_t*> |
std::smatch | std::match_results<std::string::const_iterator> |
std::wsmatch | std::match_results<std::wstring::const_iterator> |
std::pmr::cmatch (C++17) | std::pmr::match_results<const char*> |
std::pmr::wcmatch (C++17) | std::pmr::match_results<const wchar_t*> |
std::pmr::smatch (C++17) | std::pmr::match_results<std::string::const_iterator> |
std::pmr::wsmatch (C++17) | std::pmr::match_results<std::wstring::const_iterator> |
方法
sub_match对象都派生自pair<>,有以下属性或方法:
Type | Definition |
---|---|
std::csub_match | std::sub_match<const char*> |
std::wcsub_match | std::sub_match<const wchar_t*> |
std::ssub_match | std::sub_match<std::string::const_iterator> |
std::wssub_match | std::sub_match<std::wstring::const_iterator> |
可以迭代正则查找的所有结果。std::regex_iterator
是一个只读迭代器,他会遍历整个字符串,并匹配出每一个符合正则表达式的对象,匹配到的对象为std::match_results
。
默认构造的std::sregex_iterator
是尾迭代器,当一个迭代器递增到最后一个匹配的时候(即std::regex_search
返回为false时)就说明已经到达结尾了。
Type | Definition |
---|---|
std::cregex_iterator | std::regex_iterator<const char*> |
std::wcregex_iterator | std::regex_iterator<const wchar_t*> |
std::sregex_iterator | std::regex_iterator<std::string::const_iterator> |
std::wsregex_iterator | std::regex_iterator<std::wstring::const_iterator> |
const std::string s = "Quick brown fox.";
std::regex words_regex("[^\\s]+");
auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
auto words_end = std::sregex_iterator(); // 默认构造即为最后一个迭代器,也可以写为:std::sregex_iterator end;
// 匹配到的个数可以用std::distance获取
std::cout << "Found " << std::distance(words_begin, words_end) << " words:\n";
for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
std::smatch match = *i; // 匹配到的对象解引用后是一个match对象
std::string match_str = match.str();
std::cout << match_str << '\n';
}
std::regex_token_iterator
同样也是一个只读的前向迭代器,处理子序列之间的内容,特别是打算将字符串按照正则表达式拆分成一个个单元。每个迭代对象都是一个match对象。
std::regex_token_iterator
的默认构造是尾迭代器。
参数:前两个为字符串的迭代器,第三个为正则表达式,第四个表示匹配行为:
Type | Definition |
---|---|
std::cregex_token_iterator | std::regex_token_iterator<const char*> |
std::wcregex_token_iterator | std::regex_token_iterator<const wchar_t*> |
std::sregex_token_iterator | std::regex_token_iterator<std::string::const_iterator> |
std::wsregex_token_iterator | std::regex_token_iterator<std::wstring::const_iterator> |
std::regex_match
:检验是否整个字符序列匹配某个正则表达式,返回truestd::regex_search
:检验是否部分字符序列匹配某个正则表达式,搜索全部,但只输出第一个匹配到的,返回trueregex_search(data, regex(pattern))
// 等价于
regex_match(data, regex("(.|\n)*" + pattern + "(.|\n)*")
std::regex_replace
(seq, m, r, mft)/(seq, r, mft)
如果正则表达式存在错误,在运行时标准库会抛出一个类型为regex_error
的异常:
• what:描述发生了什么错误
• code:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。