文档章节

Regex: 正则表达式(3).

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/08/07 15:39
字数 912
阅读 10
收藏 0
点赞 0
评论 0

前面介绍了 std::regex来存储正则表达式,

std::regex_match和std::regex_search来使表达式和指定字符串配对.

但是在std::regex_match和std::regex_search匹配到字符串的时候会把匹配的结果存放到std::match_resultsstd::sub_match.

  • std::match_results:

template<class BidirIt, 
         class Alloc = std::allocator<std::sub_match<BidirIt>>
         > class match_results;

由上面的声明可以看出来std::match_results的构造函数不接受任何参数,但是我们必须提供模板参数:

BidirIt的两种提供方式:

1, std::match_results<std::basic_string<char>::const_iterator>;

2, std::match_results<const char*>;

另外我们也可以提供一个allocator!

还有需要我们注意的是我们提供BidirIt的时候注意要么是const_iterator要么就是const char*,为什么会这样呢?翻看了一下介绍发现匹配的结果其实是 指向被匹配的字符串的迭代器 也就是说 如果被匹配的字符串 被销毁了那么 匹配的结果也就不能用了.

 

 

std::match_results::match_results


//可以提供一个allocator.
explicit match_results( const Allocator& a = Allocator() );

//拷贝构造函数
match_results( const match_results& rhs );

//移动构造函数.
match_results( match_results&& rhs );

std::match_results::operator=

match_results& operator=( const match_results& other );
	
match_results& operator=( match_results&& other );

std::match_results::get_allocator

//返回指定的allocator.
allocator_type get_allocator() const;

std::match_results::ready

bool ready() const;

检查std::match_results的状态,默认情况下是not ready的,只有在匹配了regex后才是ready的.

std::match_results::empty

bool empty() const;

检查匹配时候成功,不成功则为empty的返回true.

std::match_results:: size

size_type size() const;

返回匹配到的字符串中子字符串的数目.

 

#include <iostream>
#include <regex>

int main ()
{
  std::string mystring ("subject");
  std::smatch mymatches;
  std::regex myregex ("(sub)(.*)");

  std::regex_match ( mystring, mymatches, myregex );

  std::cout << mymatches.size() << " matches found:" << std::endl;
  for (unsigned i=0; i<mymatches.size(); ++i)
    std::cout << "match #" << i << ": " << mymatches[i] << std::endl;

  return 0;
}



3 matches found:
match #0: subject
match #1: sub
match #2: ject

std::match_results::max_size

size_type max_size() const;

返回std::match_results可容纳的最多的子表达式的数量.

std::match_results::length

difference_type length( size_type n = 0 ) const;

返回匹配到的第n个子字符串的长度. 默认为0返回匹配到的字符串的长度.

std::match_results::positon

difference_type position( size_type n = 0 ) const;

将返回 std::distance(prefix().first, (*this)[sub].first);

 

std::match_results::str

string_type str( size_type n = 0 ) const;

返回匹配到的字符串中的第n个子字符串.

std::match_results::operator[]

const_reference operator[]( size_type n ) const;

返回匹配到的字符串中的第n个子字符串. 也请注意这里的const_reference其实是对std::sub_match.

std::match_results::prefix

const_reference prefix() const;

返回匹配到的字符串的前缀(也就是前面未被匹配到的部分).也请注意这里的const_reference其实是对std::sub_match.

std::match_results::suffix

const_reference suffix() const;

返回匹配到的字符串的后面的未被匹配到的字符串. 也请注意这里的const_reference其实是对std::sub_match.

std::match_results::format

template< class OutputIt >

OutputIter format( OutputIt out,
                   const char_type* fmt_first, const char_type* fmt_last,
                   std::regex_constants::match_flag_type flags =
                       std::regex_constants::format_default ) const;

template< class OutputIt, class ST, class SA >
OutputIter format( OutputIt out,
                   const basic_string<char_type,ST,SA>& fmt,
                   std::regex_constants::match_flag_type flags =
                       std::regex_constants::format_default ) const;

template< class ST, class SA >
std::basic_string<char_type,ST,SA>
    format( const std::basic_string<char_type,ST,SA>& fmt,
            std::regex_constants::match_flag_type flags =
                std::regex_constants::format_default ) const;
	
string_type format( const char_type* fmt_s,
                    std::regex_constants::match_flag_type flags =
                        std::regex_constants::format_default ) const;

有点类似std::regex_replace.看一个demo:

#include <iostream>
#include <string>
#include <regex>
 
int main()
{
    std::string s = "for a good time, call 867-5309";
    std::regex phone_regex("\\d{3}-\\d{4}");
    std::smatch phone_match;
 
    if (std::regex_search(s, phone_match, phone_regex)) {
        std::string fmt_s = phone_match.format(
            "$`"    // $` means characters before the match
            "[$&]"  // $& means the matched characters
            "$'");  // $' means characters following the match
        std::cout << fmt_s << '\n';
    }   
}
  • std::sub_match

std::sub_match::sub_match

template<class BidirIt> class sub_match;

也有两种指定模板参数的方式:

1, std::sub_match<std::basic_string<char>::const_iterator>;

2, std::sub_match<const char*>;

 

std::sub_match::length

difference_type length() const;

返回字符串的长度.

std::sub_match::operator string_type 和 std::sub_match::str()效果一样都是返回一个字符串.

© 著作权归作者所有

共有 人打赏支持
SHIHUAMarryMe
粉丝 12
博文 165
码字总数 138772
作品 0
武汉
程序员
linux C 中使用正则表达式(转)

#include <stdio.h> #include <sys/types.h> #include <regex.h> / 取子串的函数 / static char substr(const charstr, unsigned start, unsigned end) { unsigned n = end - start; static......

元禛慎独
2016/09/26
10
0
VS2008中使用正则表达式库Boost.Regex

VS2008中使用正则表达式库Boost.Regex 2011-04-14 10:10

香芋
2012/06/08
0
0
shell之正则表达式

正则表达式的分类: 1、基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 2、扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs),扩展的...

yanconggod
2017/11/14
0
0
Regex C++: 正则表达式(1)

自C++11起标准库提供了正则表达式库,允许我们使用通配符和pattern来查找和替换掉string中的字符. Match: 将整个string拿来匹配某个regex. Search: 查找某个string中与regex吻合的部分. Rep...

SHIHUAMarryMe
2016/08/03
67
0
正则表达式经典教程

作者:ET Dreams http://blog.csdn.net/etmonitor/ Regular Expressions (1) ---- What is Regular Expressions? 正则表达式是常见常忘,所以还是记下来比较保险,于是就有了这篇笔记。 希望...

晨曦之光
2012/03/09
317
0
第十五章 shell正则表达式

第十五章 shell正则表达式 见图片 Shell正则表达式 正则表达式的分类 基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 扩展的正则表达式(Extended Regular Expres...

506554897
05/21
0
0
正则表达式测试工具 Regex Tester 的使用方法

正则表达式测试工具“RegexTester”,下载地址:http://www.oschina.net/p/regex+tester 一、关于本文 今天的工作中遇到了一些正则表达式,我需要检验它们是否正确,不过我对自己目测的结果又...

北风其凉
2015/07/28
0
0
C++ boost 正则表达式用法

什么是正则表达式?正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。 如果您不知道什么是正则表达式,请看这篇文章http://blog.csdn.net/begtostudy/archive/2007/...

zungyiu
2010/12/25
0
0
Java正则表达式通过回溯与前后查找提取标签中的内容

在说具体的内容之前先来了解一下什么是向前查找,向后查找与回溯。我们通过一下小的例子来理解一下。具体的代码附录在最后。 向前查找 Java中向前查找的正则表达式是(?=),更加具体的就是 要...

trayvon
2016/10/20
36
0
正则表达式使用总结

正则表达式匹配中文 需要使用{} 将编码括起来 xnn :匹配ASCII代码中十六进制代码为nn的字符, 4e00 - 9fa5 是中文编码 /u : 表示按unicode(utf-8)匹配(主要针对多字节比如汉字) 正则表达式匹...

solate
2016/11/15
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Xshell登录阿里云服务器ECS

Xshell登录阿里云服务器ECS 1. 参考资料: 1). 《阿里云服务器怎么用?阿里云服务器使用教程》 链接:http://www.cr173.com/html/50758_1.html 2). eagle-zhang的CSDN博客《Xshell连接不上阿...

SuShine
6分钟前
0
0
IDEA中的HTTP Client Editor测试API

在前后端分离项目,前后端通过api进行通信。如果用postman免费版进行api测试的话,由于无法保存测试脚本到文件,不方便前端查看。 你可以选择付费版。也可以利用IDEA自带的HTTP Client Edito...

hutaishi
9分钟前
0
0
解决“只能通过Chrome网上应用商店安装该程序”的方法

摘要 : 最近有些用户反映某个Chrome插件在安装的时候,提示“只能通过Chrome网上应用商店安装该程序”,为了解决这一问题,Chrome插件网带来了相关的解决方法。 某些用户在Chrome插件网下载了...

沧海一刀
10分钟前
0
0
通过UNIX域套接字传递文件描述符

  传送文件描述符是高并发网络服务编程的一种常见实现方式。Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现。本文详细说明一下传送文件描述符的应用。 1. TCP服务...

Bwar
13分钟前
0
0
python操作Excle

# -*- coding: utf-8 -*-from openpyxl import load_workbook, Workbook#index:第几个sheet页,第一个sheet页的index为0def readExcle(filename,index): # 加载excle文件 wb = l......

淺陌离殇
15分钟前
0
0
Apache爆日志文件漏洞

全球使用最广泛的Web服务器Apache近日被爆出了一个安全漏洞,该漏洞可能导致攻击者控制服务器。 该漏洞包含在mod_rewrite 模块中的do_rewritelog()日志函数中。由于该函数还无法完全过滤写入...

问题终结者
49分钟前
0
0
阿里巴巴内部开发手册

现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有...

zbbmaster
54分钟前
0
0
34.任务计划cron chkconfig systemctl管理服务 unit target

10.23 linux任务计划cron 10.24 chkconfig工具 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 10.23 linux任务计划cron: 在linux中任务计划是必不可少的,因为可能我们凌晨的时候...

王鑫linux
54分钟前
0
0
logback.xml for spring boot

logback.xml config <?xml version="1.0" encoding="UTF-8"?><configuration> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.Colo......

qwfys
55分钟前
0
0
告警系统邮件引擎 运行告警系统

告警系统邮件引擎 因为之前做zabbix的时候,做过mail.py的脚本,在这里,直接调用进行使用就可以。 但是告警邮件引擎核心,conf主配置文件调用到的都是mail.sh ,所以这里需要定义调用mail....

lyy549745
55分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部