C++之正则表达式


我们承担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开始,从左到右依次是匹配到的结果。
TypeDefinition
std::cmatchstd::match_results<const char*>
std::wcmatchstd::match_results<const wchar_t*>
std::smatchstd::match_results<std::string::const_iterator>
std::wsmatchstd::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(): 比较匹配到的子序列
TypeDefinition
std::csub_matchstd::sub_match<const char*>
std::wcsub_matchstd::sub_match<const wchar_t*>
std::ssub_matchstd::sub_match<std::string::const_iterator>
std::wssub_matchstd::sub_match<std::wstring::const_iterator>

两个迭代器

std::regex_iterator

可以迭代正则查找的所有结果。std::regex_iterator是一个只读迭代器,他会遍历整个字符串,并匹配出每一个符合正则表达式的对象,匹配到的对象为std::match_results
默认构造的std::sregex_iterator 是尾迭代器,当一个迭代器递增到最后一个匹配的时候(即std::regex_search返回为false时)就说明已经到达结尾了。

TypeDefinition
std::cregex_iteratorstd::regex_iterator<const char*>
std::wcregex_iteratorstd::regex_iterator<const wchar_t*>
std::sregex_iteratorstd::regex_iterator<std::string::const_iterator>
std::wsregex_iteratorstd::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个匹配次表达式
TypeDefinition
std::cregex_token_iteratorstd::regex_token_iterator<const char*>
std::wcregex_token_iteratorstd::regex_token_iterator<const wchar_t*>
std::sregex_token_iteratorstd::regex_token_iterator<std::string::const_iterator>
std::wsregex_token_iteratorstd::regex_token_iterator<std::wstring::const_iterator>

三个函数

  1. 函数分别为:
  • std::regex_match:检验是否整个字符序列匹配某个正则表达式,返回true
  • std::regex_search:检验是否部分字符序列匹配某个正则表达式,搜索全部,但只输出第一个匹配到的,返回true
regex_search(data, regex(pattern))
// 等价于
regex_match(data, regex("(.|\n)*" + pattern + "(.|\n)*")
  • std::regex_replace
  1. 这些函数的参数:(seq, m, r, mft)/(seq, r, mft)
  2. 指定regex对象:
    • regex r(re 【,f】):re可以为string,一个表示字符范围的迭代器对,一个指向空字符结尾的字符数组的指针,一个字符指针,一个计数器,一个花括号包围的字符列表,f是指出对象如何处理的标识,默认为ECMAScript
    • r1=re
    • r1.assign(re, f)
    • r.mark_count()
    • f.flags()

异常

如果正则表达式存在错误,在运行时标准库会抛出一个类型为regex_error的异常:
• what:描述发生了什么错误
• code:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值