• 简单的日期正则表达式

一个简单的日期解析程序,从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})");

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

1: 2018
2: Jan
3: 18

C++实现简单的日期正则表达式的更多相关文章

  1. DCalendar增加月份选择功能--简单jQuery日期选择器插件改动

    做时间插件的时候,很多都会遇到要做选择月份的插件,但是DCalendar提供的api只支持日期选择,最近遇到这个问题,所以调整了一下源码,话不多说,先看效果吧 点击日期插件,出现上图,再点击月份就直接 ...

  2. Java中怎么简单的使用正则表达式?

    对于正则表达式,我通常的认识就是通过一些陌生的奇怪的符号就可以完成很复杂事件的好帮手!实际上正则表达式确实是这方面的好助手,接下来让我们一起认识一下Java中怎么使用正则表达式吧. 初见Pattern ...

  3. 日期正则表达式yyyyMMdd

    日期校验yyyyMMdd, 包括闰月等校验. package com.xgcd; import java.util.regex.Matcher; import java.util.regex.Patt ...

  4. Python简单时间日期处理

    import datetime #日期初始化: d1 = datetime.datetime(2005, 2, 16) d2 = datetime.datetime(2004, 12, 31) #日期 ...

  5. jQuery进行简单验证的正则表达式

    下面都是一些比较常用简单的验证,像那些特殊的复杂的情况这里不进行考虑 1.验证电话号码或者手机号码 ? 1 2 3 4 5 6 7 8 9 10 /**  * 验证电话号码(手机号码+电话号码)  * ...

  6. 用mobiscroll.js如何简单使用日期控件

    首先,可以到官网学习,地址:https://docs.mobiscroll.com 第一步:引用js.css样式 1)mobiscroll.css 2)mobiscroll_date.css 3)jq ...

  7. java日期正则表达式精准校验

      function checkDate(obj) {       var date=obj.value;     var re = new RegExp("(([0-9]{3}[1-9]| ...

  8. JS框架_(Laydate.js)简单实现日期日历

    百度云盘 传送门 密码:71hf JavaScript日期与时间组件_____laydate.js 日期日历效果: <!DOCTYPE html> <html> <hea ...

  9. awk 简单使用 egrep 正则表达式

    [root@python ~]# cat testcount.txt a 1.1.1.1b 2.2.2.2c 3.3.3.3a 1.1.1.1d 4.4.4.4e 5.5.5.5f 6.6.6.6 1 ...

  10. C++11 STL Regex正则表达式与字符串字段解析

    简单的日期正则表达式 一个简单的日期解析程序,从yyyy-mm-dd格式的日期字符串中,分别获取年月日. 先设置一个简单的正则表达式,4位数字的"年",1-2位数字的"月 ...

随机推荐

  1. freeswitch设置多个execute_on_media

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. fs中有非常多的接口和通道变量,使用方式多变. 官方文档有时候也仅仅是介绍了最基本的使用方法和格式. 环境 centos:CentO ...

  2. 1. Linux 软件介绍

    重点: rpm -i -e -qi -ql -qf -qa --scripts. yum install remove info list repolist provides. 配置系统源. 搭建私有 ...

  3. Net 高级调试之一:开始认识一些调试工具

    当进行网络高级调试时,使用合适的工具可以帮助我们更深入地了解问题所在,并提供有效的解决方案.下面是一些常用的网络调试工具,以及它们的功能和用法. 1. Wireshark:Wireshark是一个流行 ...

  4. Centos离线安装JDK+Tomcat+MySQL8.0+Nginx

    一.安装JDK 注:以下命令环境在Xshell中进行. 1.查询出系统自带的OpenJDK及版本 rpm -qa | grep jdk 2.如果显示已安装openjdk则对其进行卸载. #卸载 rpm ...

  5. 2024年 为什么不建议新人学习ABAP

    引言 每个应届生都希望自己有良好的职业发展,当他们发现前路难通时,便会寻找更好的出路. "转码"曾经是个很火热的话题.在互联网行业高速发展的年代,转行学代码,入职大厂,升职加薪,是 ...

  6. 使用create-vue创建vue3项目

    create-vue是vue3新的脚手架搭建项目工具,底层构建工具使用vite,而不是vue-cli的webpack. 但不是说你不能用以前的vue create命令来创建vue3项目,你完全可以用v ...

  7. 你是否想知道如何应对高并发?Go语言为你提供了答案!

    并发编程是当前软件领域中不可忽视的一个关键概念.随着CPU等硬件的不断发展,我们都渴望让我们的程序运行速度更快.更快.而Go语言在语言层面天生支持并发,充分利用现代CPU的多核优势,这也是Go语言能够 ...

  8. loader编写小记

    此项目在一些大佬的基础上进行了修改,或许能提供一些思路.还在学习中很菜很菜,不足之处还请师傅们多多指点 tips 对shellcode使用AES + Base85加密后以txt保存在远端供下载. 针对 ...

  9. 聊聊ChatGLM-6B部署与微调的深入理解

    ChatGLM的部署,主要是两个步骤: 在Github上下载chatglm的库文件 在Hugging Face上下载模型参数与配置文件 ChatGLM包 从Github上看ChatGLM项目文件的结构 ...

  10. C++ 动态库热加载

    C++ 动态库热加载 本文参考自 project-based-learning 中的 Build a Live Code-reloader Library for C++,主要内容都来自于其中,但是对 ...