目录
我们承担ROS,FastDDS等通信中间件,C++,cmake等技术的项目开发和专业指导和培训,有10年+相关工作经验,质量有保证,如有需要请私信联系。
常用符号
头文件:#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个分组
首尾
^
:一行的起点$
:一行的终点- \b: 一个正字词边界
- \B: 一个负字词边界
一个正则表达式的语法是否正确是在运行时解析的
regex
regex的构造函数参考这里
两个对象
std::match_results
- std::match_results:正则表达式匹配结果的集合。只能默认创建,或者,从std::regex_iterator中获取,或者,从std::regex_match和std:::regex_search修改。
- std::match_results包含对象std::sub_match,也就是说,每个std::sub_match都是一个匹配的子序列,它们组成了std::match_results,每个std::match_results的下标对应一个std::sub_match对象。其中,std::match_results的第0个元素是整个匹配到的序列,从下标1开始,从左到右依次是匹配到的结果。
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> |
方法
- prefix():sub_match对象,表现第一个匹配合格的字符的前方所有的字符
- suffix():sub_match对象,表现最末一个匹配合格的字符的后方所有字符
- size():可取得sub_match对象的个数
- str():通过这个函数可以获取匹配合格的整体字符串(通过str()或str(0)获取到)或第n个匹配合格的子字符串(通过str(n)获取),如果不存在则返回空,所以传入一个大于size()的n值是合法的
- length():获取匹配合格的整体字符串的长度(通过length()或length(0))或第n个匹配合格的子字符串长度(length(n))
- positon():获取匹配合格的整体字符串的位置(通过positon()或positon(0))或第n个匹配合格的子字符串的位置(positon(n))
- [] : 访问运算符,从0到n
- 迭代器(begin(),end(), cbegin(), cend()):可用来迭代sub_match对象,从m[0]到m[n]
std::sub_match
sub_match对象都派生自pair<>,有以下属性或方法:
- first是第一个字符的位置,second成员是最末字符的下一个位置
- length():长度
- str(): 转成字符串输出
- compare(): 比较匹配到的子序列
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::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
std::regex_token_iterator
同样也是一个只读的前向迭代器,处理子序列之间的内容,特别是打算将字符串按照正则表达式拆分成一个个单元。每个迭代对象都是一个match对象。
std::regex_token_iterator
的默认构造是尾迭代器。
参数:前两个为字符串的迭代器,第三个为正则表达式,第四个表示匹配行为:
- -1:每一个匹配的正则表达式之间的子序列
- 0:每一个匹配到正则表达式
- n:任何其他数字,表示正则表达式中的第n个匹配次表达式
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
:检验是否部分字符序列匹配某个正则表达式,搜索全部,但只输出第一个匹配到的,返回true
regex_search(data, regex(pattern))
// 等价于
regex_match(data, regex("(.|\n)*" + pattern + "(.|\n)*")
std::regex_replace
- 这些函数的参数:
(seq, m, r, mft)/(seq, r, mft)
- 指定regex对象:
- regex r(re 【,f】):re可以为string,一个表示字符范围的迭代器对,一个指向空字符结尾的字符数组的指针,一个字符指针,一个计数器,一个花括号包围的字符列表,f是指出对象如何处理的标识,默认为ECMAScript
- r1=re
- r1.assign(re, f)
- r.mark_count()
- f.flags()
异常
如果正则表达式存在错误,在运行时标准库会抛出一个类型为regex_error
的异常:
• what:描述发生了什么错误
• code: