• 简单的日期正则表达式

一个简单的日期解析程序,从yyyy-mm-dd格式的日期字符串中,分别获取年月日。

先设置一个简单的正则表达式,4位数字的“年”,1-2位数字的“月”和同样1-2位数字的“日”,中间‘-’作为分隔符。程序代码:

  1. #include <iostream>
  2. #include <regex>
  3. using namespace std;
  4. int main() {
  5. string text = "2018-7-12";
  6. regex pattern("[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}");
  7. smatch results;
  8. if ( regex_match(text, results, pattern) ) {
  9. smatch::iterator it = results.begin();
  10. int i = 0;
  11. for(; it != results.end(); ++it, ++i)
  12. cout<<i<<": "<<*it<<endl;
  13. } else {
  14. cout << "match failed: " <<text<< endl;
  15. }
  16. return 0;
  17. }

执行输出:

  1. 0: 2018-7-12

smatch类型是一个匹配结果字符串列表,列表中第一个元素永远是执行匹配操作的原始字符串,后续是根据表达式从原始字符串中解析出的子串。

程序输出结果表示日期字符串与表达式匹配正确,但并没有解析出各个日期字段子串。

如果需要解析出子串,则需要对表达式分组。

  • 表达式分组

分组后的表达式,匹配操作才会以分组位单位输出解析出的子串。将pattern表达式修改如下:

  1. regex pattern("([0-9]{4}-[0-9]{1,2}-[0-9]{1,2})");

在这里,整个表达式包含在一个圆括号里,将整个表达式作为一个分组。

执行后输出:

  1. 0: 2018-7-12
  2. 1: 2018-7-12

下标为1的输出项,即为整个表达式分组所匹配到的内容,也就是整个日期字符串,但这还没有达到逐字段分解的目标,需要将分组细分。

  • 表达式分组细分

将表达式改为:

  1. regex pattern("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})");

其中包含了3个分组(尽管后面两个分组表达式一样,但月份和日期的取值范围并不完全相同,这里只简单设置)

执行结果:

  1. 0: 2018-7-12
  2. 1: 2018
  3. 2: 7
  4. 3: 12

终于达到了日期字段分解的目标。

然后,日期字符串中,月份的表达方式可以是数字,也可以是字母名称,如Jan,Feb,Mar等,那么就需要在表达式中兼容多种格式的日期字符串。

  • 多个格式的月份表达式

当前日期字符串变更名称月份,表达式中增加月份名称:

  1. string text = "2018-Jan-18";
  2. regex pattern("([0-9]{4})-(([0-9]{1,2})|(Jan|Feb|Mar))-([0-9]{1,2})");

运行结果:

  1. 0: 2018-Jan-18
  2. 1: 2018
  3. 2: Jan
  4. 3:
  5. 4: Jan
  6. 5: 18

在这个表达式中,数字月份作为一个分组,名称月份也是一个分组,两者又合并成一个月份分组,因此匹配月份时,存在这三个分组(一个父分组包含2个子分组),运行输出结果中2-4分别是这三个分组分别对月份匹配的结果,数字月份的子分组表达式没有匹配到,因此输出空字符串。

这样的结果并不令人满意,对于月份来说,只需输出一项即可,即对于月份匹配,两个子分组不需要单独输出,只需要表示月份的父级分组输出即可。

通过将子分组指定为消极分组(Passive Group)即可。

  • 消极分组

将表达式改为:

  1. regex pattern("([0-9]{4})-((?:[0-9]{1,2})|(?:Jan|Feb|Mar))-([0-9]{1,2})");

在分组中加上“?:”前缀,即表示该分组位消极分组,在此表达式中,将数字月份和名称月份的子分组都标记为消息分组,运行结果:

  1. 0: 2018-Jan-18
  2. 1: 2018
  3. 2: Jan
  4. 3: 18

C++11 STL Regex正则表达式与字符串字段解析的更多相关文章

  1. MySQL 笔记整理(11) --怎么给字符串字段加索引?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 11) --怎么给字符串字段加索引? 日常工作中的登录系统,你很可能会使 ...

  2. Linux基本命令 和 Regex 正则表达式

    Linux基本命令 和 Regex 正则表达式 Regex 基本语法 常用匹配规则 [aeiouAEIOU] # 从中随机选择一个 [0-9]{4} # 从中选择4个 .* # 匹配任意字符 \w # ...

  3. 转:C++ Boost/tr1 Regex(正则表达式)快速指南

    C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...

  4. java 正则匹配空格字符串 正则表达式截取字符串

    java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...

  5. Java开发笔记(三十八)利用正则表达式校验字符串

    前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...

  6. C# 基于正则表达式的字符串验证

    输入的字符串校验,是开发中经常遇到的问题,常用的办法是利用正则表达式进行判断.其特点是简洁有效. 1.正则表达基础知识 正则表达式的教程很多,这里两个基础教程: a.http://www.cnblog ...

  7. Mysql hql字符串字段中是否包含某个字符串,用 find_in_set

    有这样一个需求,在Mysql数据库字符串字段(权限)中,有范围在 1 到 N 之间代表不同权限的值,分别被','分开,现在要取出具有某权限的所有成员列表. 创建表: 1 CREATE TABLE us ...

  8. Notepad++快捷键&正则表达式替换字符串&插件

    Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有颜色的为常用招数): 1. 文件 ...

  9. java 中使用正则表达式操作字符串

    import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFl ...

随机推荐

  1. java 中的自动装箱和拆箱操作

    在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个 ...

  2. php - 如何解决CURL错误( 7 ): 无法连接到主机?

    php - 如何解决CURL错误( 7 ): 无法连接到主机? 1. 问题描述 调用第三方接口,本地调用一切ok,线上调用失败! 本地通过curLRequest()方法调用第三方接口时,curl_er ...

  3. python黑帽子之udp客户端

    将上文的TCP客户端简单修改便能得到UDP客户端 import socket target_host = "127.0.0.1" target_port = 80 client = ...

  4. 入门大数据---Flume整合Kafka

    一.背景 先说一下,为什么要使用 Flume + Kafka? 以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将 Flume 聚合 ...

  5. P5676 [GZOI2017]小z玩游戏【Tarjan】

    小z玩游戏 Tarjan算是板子题吧,但是要稍微做一些修改,建边需要多考虑,建立"虚点". 题目描述 小 z 很无聊. 小 z 要玩游戏. 小 z 有\(N\)个新游戏,第\(i\ ...

  6. Using mlock ulimits for SHM_HUGETLB is deprecated

    Using mlock ulimits for SHM_HUGETLB is deprecated 前言 刚检查一个集群数据库的系统日志,发现如下信息: /var/log/message, [root ...

  7. vue 3.0 体验,vue 3.0新特性

    前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...

  8. Vue-base64移动端PDF展示

    作为一个后端开发,写前端的一些功能也是头大,好在网友强大,网上资源比较多:做一个移动端PDF预览的功能,本来可以通过window.open(),打开的,但是没办法,做后台的小伙伴,传给前端的数据是ba ...

  9. ant design pro 当中改变ant design 组件的样式和 数据管理

    ant design pro 简介 官网简介 链接 https://pro.ant.design/docs/getting-started-cn 项目结构 https://github.com/ant ...

  10. flask 源码专题(七):threading.local和高级

    1.python之threading.local 当每个线程在执行 val.num=1 ,在内部会为此线程开辟一个空间,来存储 num=1 val.num,找到此线程自己的内存地址去取自己存储 num ...