C++11 STL Regex正则表达式与字符串字段解析
- 简单的日期正则表达式
一个简单的日期解析程序,从yyyy-mm-dd格式的日期字符串中,分别获取年月日。
先设置一个简单的正则表达式,4位数字的“年”,1-2位数字的“月”和同样1-2位数字的“日”,中间‘-’作为分隔符。程序代码:
#include <iostream>
#include <regex>
using namespace std;
int main() {
string text = "2018-7-12";
regex pattern("[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}");
smatch results;
if ( regex_match(text, results, pattern) ) {
smatch::iterator it = results.begin();
int i = 0;
for(; it != results.end(); ++it, ++i)
cout<<i<<": "<<*it<<endl;
} else {
cout << "match failed: " <<text<< endl;
}
return 0;
}
执行输出:
0: 2018-7-12
smatch类型是一个匹配结果字符串列表,列表中第一个元素永远是执行匹配操作的原始字符串,后续是根据表达式从原始字符串中解析出的子串。
程序输出结果表示日期字符串与表达式匹配正确,但并没有解析出各个日期字段子串。
如果需要解析出子串,则需要对表达式分组。
- 表达式分组
分组后的表达式,匹配操作才会以分组位单位输出解析出的子串。将pattern表达式修改如下:
regex pattern("([0-9]{4}-[0-9]{1,2}-[0-9]{1,2})");
在这里,整个表达式包含在一个圆括号里,将整个表达式作为一个分组。
执行后输出:
0: 2018-7-12
1: 2018-7-12
下标为1的输出项,即为整个表达式分组所匹配到的内容,也就是整个日期字符串,但这还没有达到逐字段分解的目标,需要将分组细分。
- 表达式分组细分
将表达式改为:
regex pattern("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})");
其中包含了3个分组(尽管后面两个分组表达式一样,但月份和日期的取值范围并不完全相同,这里只简单设置)
执行结果:
0: 2018-7-12
1: 2018
2: 7
3: 12
终于达到了日期字段分解的目标。
然后,日期字符串中,月份的表达方式可以是数字,也可以是字母名称,如Jan,Feb,Mar等,那么就需要在表达式中兼容多种格式的日期字符串。
- 多个格式的月份表达式
当前日期字符串变更名称月份,表达式中增加月份名称:
string text = "2018-Jan-18";
regex pattern("([0-9]{4})-(([0-9]{1,2})|(Jan|Feb|Mar))-([0-9]{1,2})");
运行结果:
0: 2018-Jan-18
1: 2018
2: Jan
3:
4: Jan
5: 18
在这个表达式中,数字月份作为一个分组,名称月份也是一个分组,两者又合并成一个月份分组,因此匹配月份时,存在这三个分组(一个父分组包含2个子分组),运行输出结果中2-4分别是这三个分组分别对月份匹配的结果,数字月份的子分组表达式没有匹配到,因此输出空字符串。
这样的结果并不令人满意,对于月份来说,只需输出一项即可,即对于月份匹配,两个子分组不需要单独输出,只需要表示月份的父级分组输出即可。
通过将子分组指定为消极分组(Passive Group)即可。
- 消极分组
将表达式改为:
regex pattern("([0-9]{4})-((?:[0-9]{1,2})|(?:Jan|Feb|Mar))-([0-9]{1,2})");
在分组中加上“?:”前缀,即表示该分组位消极分组,在此表达式中,将数字月份和名称月份的子分组都标记为消息分组,运行结果:
0: 2018-Jan-18
1: 2018
2: Jan
3: 18
C++11 STL Regex正则表达式与字符串字段解析的更多相关文章
- MySQL 笔记整理(11) --怎么给字符串字段加索引?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 11) --怎么给字符串字段加索引? 日常工作中的登录系统,你很可能会使 ...
- Linux基本命令 和 Regex 正则表达式
Linux基本命令 和 Regex 正则表达式 Regex 基本语法 常用匹配规则 [aeiouAEIOU] # 从中随机选择一个 [0-9]{4} # 从中选择4个 .* # 匹配任意字符 \w # ...
- 转:C++ Boost/tr1 Regex(正则表达式)快速指南
C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...
- java 正则匹配空格字符串 正则表达式截取字符串
java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...
- Java开发笔记(三十八)利用正则表达式校验字符串
前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...
- C# 基于正则表达式的字符串验证
输入的字符串校验,是开发中经常遇到的问题,常用的办法是利用正则表达式进行判断.其特点是简洁有效. 1.正则表达基础知识 正则表达式的教程很多,这里两个基础教程: a.http://www.cnblog ...
- Mysql hql字符串字段中是否包含某个字符串,用 find_in_set
有这样一个需求,在Mysql数据库字符串字段(权限)中,有范围在 1 到 N 之间代表不同权限的值,分别被','分开,现在要取出具有某权限的所有成员列表. 创建表: 1 CREATE TABLE us ...
- Notepad++快捷键&正则表达式替换字符串&插件
Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有颜色的为常用招数): 1. 文件 ...
- java 中使用正则表达式操作字符串
import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFl ...
随机推荐
- JavaWeb网上图书商城完整项目--day02-19.修改密码功能流程分析
我们来看看修改密码的业务流程操作:
- list 迭代器的用法
string strTemp; list<string> strList; char *ch = new char[]; strcpy( ch , ""); strTe ...
- 扫描U盘
编辑器加载中...int CSendUDiskDlg::SearchUDisk(void) { int nCount, i; char szDriver[3]; nCount = 0; szDrive ...
- Centos7安装部署openstack--nova计算服务
一.概述 使用OpenStack计算服务来托管和管理云计算系统.OpenStack计算服务是基础设施即服务(IaaS)系统的主要部分,模块主要由Python实现. OpenStack计算组件请求Ope ...
- 用户不在sudoers文件中怎么办,ziheng is not in the sudoers file解决方法
sudo是linux系统中,用来执行需要权限命令,但是一些朋友使用sudo时,出现下面的错误“ziheng is not in the sudoers file. This incident will ...
- 前端分页(js)
//前端分页 var limit = 10; //每页显示数据条数 var total = $('#host_table').find('tr').length; var allPage = tota ...
- plus.runtime.quit()是个好函数
对于H5+APP开发,应用的生命周期监听函数里是对应用行为的监控,但是并不对应用执行退出或重启操作.相关操作还是要使用mui
- 使用LLDB和debugserver对ios程序进行调试
在没有WIFI的情况下,使用USB连接IOS设备,使用辅助插件usbmuxd来辅助调试.我其实也想用wifi调试,奈何公司的wifi绑定了mac地址,而我又使用的是黑苹果虚拟机,使用桥接的方式修改网段 ...
- gitlab-ci部署实现持续集成(centos7)
一.gitlab安装 1. 环境准备 // selinux和 firewall 关闭 $ setenforce 0 $ sed -i "/^SELINUX/s/enforcing/disab ...
- IIFE中的函数是函数表达式,而不是函数声明
下面的代码打印什么内容,为什么? var b = 10; (function b(){ b = 20; console.log(b); })(); 针对这题,在知乎上看到别人的回答说: 函数表达式与函 ...