文档章节

Regex C++: 正则表达式(1)

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/08/03 23:15
字数 1076
阅读 823
收藏 1

自C++11起标准库提供了正则表达式库,允许我们使用通配符pattern查找和替换掉string中的字符.

Match: 将整个string拿来匹配某个regex.

Search: 查找某个string中与regex吻合的部分.

Replace: 将与正则表达式吻合的第一个(或者后续所有的)子序列替换掉.

Tokenize: 切分即通过指定来切分出来我们感兴趣的正则表达式匹配到的内容.

 

那么我们来看一个例子吧,先不用管正则表达式的文法:

#include <iostream>
#include <regex>
#include <string>
#include <utility>
int main()
{
	std::regex regOne("<.*>.*<.*>");
	std::string str("<tg>value</tag>");
	std::smatch resultOne;
	bool booleanOne = std::regex_match(str, resultOne, regOne);
	std::cout << std::boolalpha << booleanOne << std::endl;

	std::smatch resultTwo;
	bool booleanTwo = std::regex_search(str, resultTwo, regOne);
	std::cout << std::boolalpha << booleanTwo << std::endl;

	return 0;
}

std::regex_match()检查是否整个字符序列匹配某个正则表达式.

std::regex_search()检查是否部分字符序列匹配某个正则表达式.

 

std::basic_regex

template <typename charT, typename traits = regex_traits<charT> > 
class basic_regex;

其中我们上面使用的std::regex其实就是一个: typedef  std::basic_regex<char> regex;

此外官方还特例化了一个std::wregex其实是: typedef std::basic_regex<w_char> wregex;

我们在构造 std::basic_regex对象的时候除了给出必须给出的正则表达式外海可以指定要给flag:

flag是个可选的参数,默认值为 ECMAScript(使用的是ECMA-262规范,很多web浏览器用的也是这个标准.


//默认构造函数.
basic_regex();

//拷贝构造函数.
basic_regex (const basic_regex& rgx);

//移动构造函数.
basic_regex (basic_regex&& rgx) noexcept;


//显式的接受一个C风格字符串的构造函数.
explicit basic_regex ( const charT* str, flag_type flags = ECMAScript );


//接受一个C风格的字符串前len个字符作为参数构造一个std::basic_regex对象.
basic_regex ( const charT* str, size_t len, flag_type flags = ECMAScript );


//接受一个std::basic_string.
template <class ST, class SA>
  explicit basic_regex ( const basic_string<charT,ST,SA>& str, flag_type flags = ECMAScript );


//接受一对迭代器范围内的字符.
template <class ForwardIterator>
  basic_regex (ForwardIterator first, ForwardIterator last, flag_type flags = ECMAScript );


//接受一个{}括住的字符列表.
basic_regex (initializer_list<charT> il, flag_type flags = ECMAScript );

通过上面的构造函数(拷贝构造函数和移动构造函数除外)我们发现默认的flag都是ECMAScript.

所有的flag都定义在命名空间: std::regex_constants中.

以下均属于: syntax_option_type类型,其实也就是定义在std::regex_constants这个namespace中的enum类型.

std::regex_constants::icase :该flag支持在正则表达式匹配过程中忽略大小写.

std::regex_constants::nosubs :表flag表明在匹配过程中不保存匹配的子表达式.

std::regex_constants::optimize :表明正则表达式匹配时候执行速度优于构造速度.

std::regex_constants::ECMAScript : 使用ECMA-262指定的语法.

std::regex_constants::extended : 使用POSIX扩展的正则表达式语法.

std::regex_constants::basic : 使用POSIX的基本正则表达式语法.

std::regex_constants::awk : 使用POSIX版本的awk语言的语法.

std::regex_constants::grep : 使用POSIX版本的grep的语法.

std::regex_constants::egrep : 使用POSIX版本的egrep的语法.

std::basic_regex有几个成员函数让我们来看看:

std::basic_regex::assign


//等同于拷贝构造函数.
basic_regex& assign( const basic_regex& other );

//等同于移动构造函数.
basic_regex& assign( basic_regex&& that );

//接受一个C风格的字符串和flag用来构造一个std::basic_regex对象.	
basic_regex& assign( const CharT* s, flag_type f = std::regex_constants::ECMAScript );

//接受一个c风格的字符串的前count个字符用来构造一个std::basic_regex对象.
basic_regex& assign( const charT* ptr, size_t count, flag_type f = std::regex_constants::ECMAScript );

//接受一个std::basic_string和一个flag用来构造.	
template< class ST, class SA >
basic_regex& assign( const std::basic_string<CharT,ST,SA>& str, flag_type f = std::regex_constants::ECMAScript );

//接受一对 iterator范围内的字符用来构造.
template< class InputIt >
basic_regex& assign( InputIt first, InputIt last, flag_type f = std::regex_constants::ECMAScript );

//接受一个{}括着的字符列表用来构造.
template<typename charT>
basic_regex& assign( std::initializer_list<CharT> ilist, flag_type f = std::regex_constants::ECMAScript );

std::basic_regex::mark_count

unsigned mark_count() const;

返回正则表达式中子表达式的数目.

std::basic_regex::flags

flag_type flags() const;

返回正则表达式中的flags

Demo for std::basic_regex

#include <iostream>
#include <regex>
#include <string>
#include <utility>

int main()
{
	std::string str("<person>value</person>");
	std::basic_regex<char> regex("<(.*)>.*</.*>", std::regex_constants::icase | std::regex_constants::ECMAScript);

	std::cout << regex.mark_count() << std::endl;

	std::match_results<std::string::const_iterator> result;
	bool boolean = std::regex_search(str, result, regex);
	
	std::cout << std::boolalpha << "是否匹配成功: " << boolean << " " << regex.mark_count() << std::endl;
	std::cout << result[0].str() << std::endl;

	return 0;
}

 

 

 

© 著作权归作者所有

SHIHUAMarryMe
粉丝 13
博文 162
码字总数 138435
作品 0
武汉
程序员
私信 提问
加载中

评论(0)

C++正则表达式regex库使用方法总结

目录 一、regex库中常用组件介绍 二、regex库中常用组件使用 1、regex库组件使用准备 2、regex_match使用 3、regex_search使用 4、regex_replace使用 5、sregex_iterator使用 三、基于regex...

Asia-Lee
03/31
0
0
VS2008中使用正则表达式库Boost.Regex

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

香芋
2012/06/08
539
0
C++0x 已然拖成 C++1x

一个热爱 C++ 的程序员应该知道 C++0x 为何物吧。C++ 标准制定委员会曾在 1998 年和 2003 年制定和更新了 C++ 的标准,使 C++ 的编写更规范,功能也得到了提升。但是每次标准的制定后,委员会...

小编辑
2010/05/12
1.9K
11
C++正则表达式regex初探及踩的坑

前言 前段时间开发的过程需要对字符串匹配过滤操作,这就涉及到了正则表达的功能。这篇文章是个人对c++正则表达式程序库regex使用的笔记,如有不正确的地方欢迎指正。 Regex库简介 Regex是从...

BeyondWXF
02/21
25
0
C++新标准——C++1x

本文转自:http://liuyue.asia/2010/03/18/cpp0x-has-become-cpp1x/ 一个热爱 C++ 的程序员应该知道 C++0x 为何物吧。C++ 标准制定委员会曾在 1998 年和 2003 年制定和更新了 C++ 的标准,使...

张明
2010/03/18
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring ElasticsearchTemplate 经纬度按距离排序

es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度) @Document(indexName = "v_intelligent_store")@Datapublic class IntelligentStore imp......

osc_s752w055
23分钟前
53
0
Spring ElasticsearchTemplate 经纬度按距离排序

es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度) @Document(indexName = "v_intelligent_store")@Datapublic class IntelligentStore imp......

osc_l330x9u1
24分钟前
55
0
Spring ElasticsearchTemplate 经纬度按距离排序

es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度) @Document(indexName = "v_intelligent_store")@Datapublic class IntelligentStore imp......

osc_kd8rd7b3
25分钟前
58
0
Android Studio开发获取本地时间

实现本地聊天记录功能,用到获取本地时间的函数,感觉比较实用,分享给大家! 1、在相应moudle的java文件夹下建立自己的util文件夹如·: 2、建立DateUtil类 package com.example.junior.uti...

osc_k6latecv
27分钟前
60
0
给 Windows 的终端配置代理

初衷 由于项目开发使用go,所以经常要用到go get,但是吧,terminal下根本没办法下载啊,经常下载三个小时包,写代码一个小时 本质上go get就是在使用git clone吧 迫于无奈,只好找个方式可以在...

osc_ocl8o73l
28分钟前
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部