C++ 使用正则表达式拆分字符串
今天做到一道题,给定一个类似于广义表的字符串(aaaa(bbbb(cccc,dddd),eeee(ffff)))
,表明的是各个人的层次关系。比如aaaa是bbbb和eeee的领导,bbbb是cccc和dddd的领导,现输入一个名称,比如ffff,要求输出其领导关系输出:aaaa>eeee>ffff
。
对于这样一个字母与括号混合在一起的字符串,我首先想到要对其进行拆分。不过字符串拆分的场景有很多,如果仅仅针对这一个问题,未免有些浪费,不如写一个较为通用的方法。于是想到尝试利用正则表达式进行拆分。
要匹配由字母组成的姓名很简单,由一个或多个大小写字母组成,即regex reg("[a-zA-Z]+");
。
常用到的函数有两个:
函数 | 功能 |
---|---|
bool regex_match(s,reg) | 字符串 s与表达式reg是否完全匹配(注意是完全匹配) |
bool regex_search(s,M,reg) | 字符串s中是否有子串与表达式reg匹配,结果对象存储在M中 |
接下来详细解释下这个 “ M ”。
引用了https://zh.cppreference.com/w/cpp/regex/regex_search
其类型为smatch,即smatch M;
若不存在该子串(匹配失败):
方法 | 返回值 |
---|---|
M.ready() | true |
M.empty() | true |
M.size() | 0 |
若存在该子串:
方法 | 返回值 |
---|---|
M.ready() | true |
M.empty() | false |
M.size() | 有标记子表达式的数量加 1 ,即 1+e.mark_count() |
M.prefix() | 前缀字符串 |
M.prefix().first | 指向 该匹配成功的子串 的前缀 的第一个字符的 迭代器 |
M.prefix().second | 指向 该匹配成功的子串 的前缀 的最后一个字符的下一个字符 的迭代器 |
M.suffix() | 后缀字符串 |
M.suffix().first | 同上,这个是后缀 |
M.suffix().second | 同上,这个是后缀 |
M[0].first | 指向匹配序列的首字符 的迭代器 |
M[0].second | 指向匹配数列的结尾后下一个字符 的迭代器 |
M[0].matched | true |
M[n].first | 匹配有标记子表达式 n 的序列的起始,或若子表达式不参与匹配则为 last |
M[n].second | 匹配有标记子表达式 n 的序列的结尾,或若子表达式不参与匹配则为 last |
M[n].matched | 若子表达式 n 参与匹配则为 true ,否则为 false |
终于介绍完了,下面是代码:
我想到的是用递归的方法实现划分(divide)函数:
- 调用regex_search方法,若匹配成功:
1. 将前缀中所有非,
的字符放入vector
2. 将匹配的字符放入vector
3. 对后缀调用divide方法 - 若匹配失败(当前串中已无要匹配的子串):
1. 将当前串所有字符放入vector
#include <iostream>
#include <string>
#include <vector>
#include <regex>
using namespace std;void divide(string s,vector<string> &v,regex reg)
{smatch mResult;if (regex_search(s, mResult, reg)) {for (auto it = mResult.prefix().first; it != mResult.prefix().second; it++) {if (*it == ',')continue;v.push_back(string(1, *it));}v.push_back(string(mResult[0].first, mResult[0].second));divide(mResult.suffix(), v, reg);}else {for (auto it = s.begin(); it != s.end(); it++)v.push_back(string(1, *it));}
}int main()
{string source;vector<string> mid;cin >> source;regex reg("[a-zA-Z]+");divide(source, mid, reg);vector<string>::iterator it;for (it = mid.begin(); it != mid.end(); it++) {cout << *it << ' ';}
}
至于具体通用性如何,以后再修改吧哈哈
C++ 使用正则表达式拆分字符串相关推荐
- oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...
这个题目的确不大好写,其实际含义基于一个场景: 比如在oracle的某张表中,有两个字段 A1 B1 1 A,B,C,D, 2 E,F 假如现在的需求 ...
- 正则表达式操作字符串
概念 正则表达式(Regular Expression),又称规则表达式.正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串& ...
- Java如何拆分字符串
假如现在有这样一串字符序列"沉默王二,一枚有趣的程序员",需要按照中文逗号","进行拆分,这意味着第一串字符序列为逗号前面的"沉默王二",第 ...
- python3.x 使用正则表达式拆分字符串并换行显示
最近使用正则表达式拆分化学式,且拆分后的化学式要换行显示,于是用python正则表达式写了一个拆分字符串且拆分后的字符串换行显示的Demo,主要使用正则re模块的findall方法. 关于findal ...
- scala 拆分字符串翻转_Scala程序分割字符串
scala 拆分字符串翻转 A string is a collection that stores multiple characters, it is an immutable sequence ...
- 正则表达式查找字符串_如何简单理解正则表达式?只需1分钟就可以看到她优美的舞姿...
Hi,大家好,本章节开始将会从零开始和大家用图文的方式,让你从零基础学会正则表达式!有兴趣的小伙伴可以持续关注我,或者在专栏中进行查看自我学习,愿与君携手前行! 本文将要说到的正则表达式?可能初学的你 ...
- jQuery拆分字符串 split()并且遍历$.each()
1.拆分字符串 语法:字符串名.split(separator,howmany) separator 必需.字符串或正则表达式,从该参数指定的地方分割 stringObject. howmany 可选 ...
- 举个栗子!Tableau 技巧(199):用 Prep 正则表达式拆分复杂字段
数据准备时,我们经常会遇到需要拆分的字段.对于比较简单规整的字段,可以用 split() 函数进行拆分. 但是,如果遇到较复杂的情况(如下图):没有固定的长度,分隔字符不固定,分隔字符的数量也不固定. ...
- 如何在Python中拆分字符串
使用字符串时,常见的操作之一是使用给定的分隔符将字符串拆分为子字符串数组.在本文中,我们将讨论如何在Python中拆分字符串. PYthon学习企鹅裙:88198-2657 领取python自动化编程 ...
- Split()拆分字符串与StringTokenizer拆分字符串
前言 不管用何种编程语言写代码,对字符串的处理都是必不可少的,其中对字符串的拆分在许多场合都频繁用到. 今天介绍Java中两种主流的拆分方法,一是lang包String类的split()方法,另一种则 ...
最新文章
- Intel Realsense D435 composite_frame类 frame类 video_frame类 depth_frame类的关系
- ORACLE 调试输出,字符串执行函数
- leetcode 67. 二进制求和(C语言)
- request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法
- Qt笔记-QSslSocket双向认证
- 7-10 求数字个数 (20 分)
- [转载] JAVA中transient 关键字
- 统计学基础知识(二)
- 201903股票投资与实践入门三:资金流向与K线入门
- sed替换字符串的贪婪匹配和最小匹配
- ARM发布Cortex-X1,是为了向苹果自研A系列处理器发起冲击吗?
- html5实现canvas迷宫游戏,HTML5/Canvas/JS 迷宫生成动画
- Wireshark之流量包分析+日志分析 (护网:蓝队)web安全 取证 分析黑客攻击流程(上篇)
- 文件在服务器中存储,如何发送音频文件在服务器中存储
- CS188 Proj 1
- 各大跨境电商卖家不容错过下半年的促销活动安排
- java递归把list菜单列表转为菜单树
- plsql导入/出dmp文件注意点
- paraview管道:PipeLine
- dnf哪个服务器稳定,《dnf》国服95版本职业排行 最强职业排行榜一览
热门文章
- zabbix 2.4.5 自定义key监控redis
- java输出到txt,换行问题
- HCIE-RS面试---STP拓扑变化过程
- 游戏筑基开发之C语言打印(printf)中文时出现乱码的解决方案
- 华为STP相关功能配置
- Bugku-Web-速度要快-WriteUp
- linux定时任务页面管理平台jobx
- 黑客事件中如何实现利益最大化?
- 【总结】大端、小端存储模式的那点事
- DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta's Colorful Graph