• 简单的日期正则表达式

一个简单的日期解析程序,从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正则表达式与字符串字段解析的更多相关文章

  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权限管理系统

    http://coding.imooc.com/class/evaluation/149.html

  2. 几个超级实用但很少人知道的 VS 技巧

    大家好,今天分享几个我知道的实用 VS 技巧,而这些技巧我发现很多人都不知道.因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS "骚"操作 ...

  3. 腾讯IEG--2020春招实习

    笔试 正常批就五道编程题,可以跳出使用本地IDE,题目很好理解,基本都能写出来,但是要过全部用例不容易.具体题目和题解可以看看这位大佬的牛客帖子,我的就不献丑了,有两题都只过了40%,我当时是用C#做 ...

  4. 使用TimerTask创建定时任务

    使用TimerTask创建定时任务,打包之后应用于linux系统 step1:创建java项目 step2:代码实现 定时任务实现类CreateTask.java是打印操作者的名字 配置准换类Conf ...

  5. Spring WebFlux 01 (原理及使用场景)

    一.什么是 Spring WebFlux 好多人以为Spring WebFlux就是Spring MVC的升级版,其实不然,那到底什么是Spring WebFlux呢,首先就要搞清楚Spring We ...

  6. jquery入门(1)

    1.jQuery简介 jQuery是一个快速.简洁的JavaScript框架,倡导写更少的代码,做更多的事情 jquery官方网站 jquery中文文档 1.1.简单函数封装 根据id.类名称来获取元 ...

  7. Dysregulation of Exosome Cargo by Mutant Tau Expressed in Human-induced Pluripotent Stem Cell (iPSC) Neurons Revealed by Proteomics Analyses(蛋白质组学揭示了人诱导的多能干细胞(iPSC)神经元中表达的突变Tau对外泌体的失调) 解读人:梁玉婷

    期刊名:MCP 发表时间:(2020年4月) IF:4.828 单位:Skaggs School of Pharmacy and Pharmaceutical Sciences, University ...

  8. hive中left semi join 与join 的区别

    LEFT SEMI JOIN:左半开连接会返回左边表的记录,前提是其记录对于右边表满足ON语句中的判定条件.对于常见的内连接(INNER JOIN),这是一个特殊的,优化了的情况.大多数的SQL方言会 ...

  9. Orleans 框架3.0 官方文档中文版系列一 —— 概述

    关于这个翻译文档的一些说明: 之前逛博客园的时候,看见有个园友在自己的博客上介绍Orleans. 觉得Orleans 是个好东西. 当时心想:如果后面有业务需要的时候可以用用Orleans框架. 当真 ...

  10. 利用Chrome浏览器调试线上代码

    前言 之前调试前端bug都是在开发环境中做完并多次测试没有问题之后发布测试环境,验收合格之后发布生产.但生产环境偏偏会有和开发和测试环境不一致的情况,例如测试环境需要加密,而开发环境先不加密,测试环境 ...