C++ 正则表达式的应用详解

目录
  • 一、为什么要学正则表达式
  • C++string处理:
  • 二、正则程序库(regex)
    • 正则文法:
    • 正则库:
    • 匹配(Match)
    • 搜索(Search)
    • 替换(Replace)

一、为什么要学正则表达式

若要判断一个输入的QQ号是否有效,如何判断?

判断步骤:

  • 长度大于5,小于等于10;
  • 首位不能为0;
  • 是否为纯数字?

C++string处理:

#include<iostream>
using namespace std;
int main()
{
    string qq = "7466a2063";
    if (qq.length() >= 5 && qq.length() <= 11)
    {
        // 2. 判断是否非'0'开头
        if (qq[0] != '0')
        {
            // 3. 判断是否为纯数字
            for each (char var in qq)
            {
                cout << var;
                if (var < '0' || var > '9')
                {
                    cout << "不存在" << endl;
                    return 0;
                }
            }
            cout << "存在" << endl;
        }
        else
        {
            cout << "不存在" << endl;
        }
    }
    else
    {
        cout << "不存在" << endl;
    }
    return 0;
}

虽然功能实现了但是非常麻烦

#include<iostream>
#include<regex>
using namespace std;
int main()
{
    regex qq_reg("[1-9]\\d{4,11}");
    string qq = "746632063";
    smatch result;
    bool ret = regex_match(qq, result, qq_reg);
    cout << (ret ? "存在" : "不存在") << endl;
    return 0;
}

正则表达式只需几行代码就行了。

是不是很方便呢?那么接下来便来看看C++如何使用正则表达式

二、正则程序库(regex)

C++11 新增了正则表达式的标准库支持,本文简介 C++ 正则表达式的使用: std::regex是C++用来表示正则表达式(regular expression)的库,它是class std::basic_regex<>针对char类型的一个特化,还有一个针对wchar_t类型的特化为std::wregex。文档介绍

正则文法:

正则库:

regex

表示有一个正则表达式类,比如:regex pattern("(.{3})(.{2})_(\d{4})!")

regex_match

全文匹配,要求整个字符串符合正则表达式的匹配规则。用来判断一个字符串和一个正则表达式是否模式匹配,返回一个 bool 值,true 为匹配,false 为不匹配。匹配的含义是目标字符串必须完全和正则表达式相匹配,不能有多余的字符,如果需要部分匹配则应使用regex_search regex_search 搜索匹配,根据正则表达式来搜索字符串中是否存在符合规则的子字符串。 能和正则表达式相匹配就返回true

regex_replace

替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。要求输入一个正则表达式,以及一个用于替换匹配子字符串的格式化字符串。这个格式化字符串可以通过转义序列引用匹配子字符串中的部分内容

sregex_iterator

迭代器适配器,调用regex_search来遍历一个string中所有匹配的子串

smatch/match_results

容器类,保存在string中搜索的结果。如果匹配成功,这些函数将成功匹配的相关信息保存在给定的smatch对象中。比如:smatch results;将匹配结果存放在results中,另一种存储方法声明:match_resultsstring::const_iterator result

匹配(Match)

字符串处理常用的一个操作是匹配,即字符串和规则恰好对应,而用于匹配的函数为std::regex_match(),它是个函数模板

bool regex_match(string s,regex pattern)

bool regex_match(string s,smatch result,regex pattern)

bool regex_match(s.cbegin()+i,s.cend(),smatch result,regex pattern)

参数s为要匹配的字符串,pattern为匹配规则,result保存结果s.cbegin()+i,s.cend()对应s的匹配s迭代器所取的范围。

更多的时候我们希望能够获得匹配结果(字符串),对结果进行操作。这时就需要对匹配结果进行存储,共有两种存储方式。

match_resultsstring::const_iterator result;

smatch result; //推荐

如果需要保存结果,可以用第二种函数,用smatch result保存结果。通常result[0]保存整个匹配结果,result[i]保存第i个捕获组的匹配结果,即模式中第i个括号的匹配结果。如果没有这样的结果则为空。可以用result.size()查看一共有多少个匹配结果。

#include<iostream>
#include<regex>
using namespace std;
int main()
{
	string str = "Hello_2021";
	smatch result;
	regex pattern("(.{5})_(\\d{4})");	//匹配5个任意单字符 + 下划线 + 4个数字

	if (regex_match(str, result, pattern))
	{
		cout << result[0] << endl;		//完整匹配结果,Hello_2018
		cout << result[1] << endl;		//第一组匹配的数据,Hello
		cout << result[2] << endl;		//第二组匹配的数据,2018
		cout << "结果显示形式2" << endl;
		cout << result.str() << endl;	//完整结果,Hello_2018
		cout << result.str(1) << endl;	//第一组匹配的数据,Hello
		cout << result.str(2) << endl;	//第二组匹配的数据,2018
	}

	//遍历结果
	for (int i = 0; i < result.size(); ++i)
	{
		cout << result[i] << endl;
	}

}

result结构为如下图,result[0]为匹配的字符串,result[1]为Hello result[2]为2021

result[]与result.str()这两种方式能够获得相同的值,我更喜欢用数组形式的。在匹配规则中,以括号()的方式来划分组别,实例中的规则共有两个括号,所以共有两组数据

搜索(Search)

搜索与匹配非常相像,其对应的函数为std::regex_search,也是个函数模板,用法和regex_match一样,不同之处在于搜索只要字符串中有目标出现就会返回,而非完全匹配。

bool regex_search(string s,regex pattern)

bool regex_search(string s,smatch result,regex pattern)

bool regex_search(s.cbegin()+i,s.cend(),smatch result,regex pattern) //从字符串的某个位置开始匹配?

string str = "Hello 2018, Bye 2017";
smatch result;
regex pattern("\\d{4}");	//匹配四个数字

//迭代器声明
string::const_iterator iterStart = str.begin();
string::const_iterator iterEnd = str.end();
string temp;
while (regex_search(iterStart, iterEnd, result, pattern))
{
	temp = result[0];
	cout << temp << " ";
	iterStart = result[0].second;	//更新搜索起始位置,搜索剩下的字符串
}

输出结果:2018 2017

搜索给定字符串中是否存在与模式匹配的子串,如果存在则返回true。

同样可以用smatch result记录结果,但不同的是result[0]记录的是整个字符串中从左往右第一个匹配模式的子串。

假如有多个子串符合模式,若想知道result[0]中存储的是第几个子串,可以用result.position()函数,返回数从0开始。

替换(Replace)

replace是替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。

string regex_replace(string s,regex p,string replace_str)

string str = "Hello_2021!";
regex pattern("Hello");
cout << regex_replace(str, pattern, "") << endl;
cout << regex_replace(str, pattern, "Hi") << endl;

到此这篇关于C++ 正则表达式的应用详解的文章就介绍到这了,更多相关C++ 正则表达式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 正则表达式简介及在C++11中的简单使用教程

    正则表达式Regex(regular expression)是一种强大的描述字符序列的工具.在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分,不仅如此,它还支持了6种不同的正则表达式的语法,分别是:ECMASCRIPT.basic.extended.awk.grep和egrep.其中ECMASCRIPT是默认的语法,具体使用哪种语法我们可以在构造正则表达式的时候指定. 正则表达式是一种文本模式.正则表达式是强大.便捷.高效的文本处理工具.正则表达式本身,加上如同一门

  • c++使用正则表达式提取关键字的方法

    下面看下c++通过正则表达式提取关键字,代码如下所示: string text = "岳云鹏的对象叫铁锤"; regex pattern("(.*)的对象叫(.*)"); smatch results; if (regex_match(text, results, pattern)) { for (auto it = results.begin(); it != results.end(); ++it) cout << *it << endl

  • C++实现LeetCode(10.正则表达式匹配)

    [LeetCode] 10. Regular Expression Matching 正则表达式匹配 Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. T

  • c++11中regex正则表达式示例简述

    regex库中涉及到的主要类型有: 以std::string为代表的处理字符串的类型(我们知道还有存储wchar_t的wstring类.原生c式字符串const char*等等,为了简化处理仅介绍std::string类型相关的操作,当你把握住了regex的主脉络之后,想使用其他的版本只要类比就可以) std::regex类,该类型需要一个代表正则表达式的字符串和一个文法选项作为输入,当文法选项不提供时默认为ECMAScript. std::match_results类,该类用来记录匹配的结果,

  • 关于日期正则表达式的思路详解

    1        概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好. 前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正. 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用.因应用场景的不同,写出的正则也不同,复杂程度也自然不同.正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂

  • js正则表达式常用函数详解(续)

    正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快. 正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回

  • 表单验证正则表达式实例代码详解

    表单验证正则表达式具体内容如下所示: 首先给大家解释一些符号相关的意义 1.  /^$/ 这个是个通用的格式. ^ 匹配输入字符串的开始位置:$匹配输入字符串的结束位置 2. 里面输入需要实现的功能. * 匹配前面的子表达式零次或多次:        + 匹配前面的子表达式一次或多次:        ?匹配前面的子表达式零次或一次:        \d  匹配一个数字字符,等价于[0-9] 下面通过一段代码给大家分析表单验证正则表达式,具体代码如下: <!DOCTYPE html> <h

  • javascript类型系统_正则表达式RegExp类型详解

    前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,使用正则表达式可以进行强大的模式匹配和文本检索与替换.本文将介绍正则表达式的RegExp对象,以及正则表达式涉及 到的属性和方法 对象 javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法:另一种是构造函数写法 Perl写法 正则表达式字面量写法,又叫Perl写法,因为javascript的正则表达式特性

  • 正则表达式grep用法详解

    语法:grep 选项 'word' filename -c:打印符合要求的行数 -i:不区分大小写 -n:在输出符合要求的行的同时显示行号 -v:打印不符合要求的行 -A:后跟一个数字n,表示打印符合要求的行以及下面n行 -B:后跟一个数字n,表示打印符合要求的行以及上面n行 -C:后跟一个数字n,表示打印符合要求的行以及上下各n行 -r:会把目录下所有的文件全部遍历 --color:把匹配到的关键词用红色标示 例子: 过滤出带有某个关键词的行并输出行号 grep -n 'root' 1.txt

  • 正则表达式使用示例详解

    正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式使用单个字符串来描述.匹配一系列匹配某个句法规则的字符串. 下面通过实例代码介绍下正则表达式使用 //一个数据类型,记录文本规则,一些事先定义好的一些特殊字符,对字符串的过滤逻辑 //表单验证账号长度,字母或数字组合,高级搜索 //特点,不仅js有:极简的方式操作字符串:灵活,功能强大 // 正则表达式大全 var patt1=new

  • C语言中的正则表达式使用示例详解

    正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE).正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 在c语言中,用regcomp.regexec.regfree 和regerror处理正则表达式.处理正则表达式分三步: 编译正则表达式,regcomp: 匹配正则表达式,regexec: 释放正则表达式,regfree. 函数原型 /* 函数说明:Regcomp将正则表达式字符串regex编译

  • Go语言正则表达式的使用详解

    正则表达式是一种进行模式匹配和文本操纵的功能强大的工具.正则表达式灵活.易用,按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合. 准则 默认是最短匹配,只要字符串满足条件就返回. 如果没有匹配到,都是返回为nil. 如果需要做最长匹配,调用Longest()函数. 正则表达式功能:匹配(macth),查找(find)和替换(replace). 存在长度选择的函数,传入<0的数字表示匹配全部. 使用regexp调用 Match,MatchReader和 M

  • Python常用的正则表达式处理函数详解

    正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便. 在Python中,我们通过调用re库来使用re模块: import re 正则表达式语法模式和操作符详见:https://www.runoob.com/python/python-reg-expressions.html#flags 下面介绍Python常用的正则表达式处理函数. re.match函数 re.match 函数从字符串的起始位置匹配正则表达式,返回match对象,如果不

  • 轻松掌握正则表达式findall函数详解

    正则表达式入门-findall()函数 findall()函数 例子 import re a = '123abc' re=re.findall('\d\d\d',a) print(re) 导入用于完成正则表达式操作的re库 使用re库中的findall()函数提取文本 '\d'表示匹配1个数字,那么'\d\d\d'就表示匹配连续的3个数字 语法为 re.findall(匹配规则,原始文档) 注意:findall()函数返回的是一个包含提取结果的列表 import re a = '456qwe78

随机推荐