撰写本文档的初衷本来是想介绍正则表达式怎么写,但是百度一搜,正则表达式的教程的质量已经相当高,我便不在班门弄斧了。正则表达式是一种方法,在不同的语言中,它的应用样式可能会不同,但是方法是一样的,只要了解好标准的正则表达式如何写,就能应付其他语言下的正则表达式样式。

那本文主要收集了常用编程语言下的应用样式 ,让大伙认识正则表达式在不同语言下的应用,至于基础,请大伙移步专业的教程。https://www.runoob.com/regexp/regexp-tutorial.html

一、正则表达式类型

正则表达式分为:①基础正则表达式 ②扩展正则表达式

基础正则表达式是最先提出和应用的,后来发现有些情况匹配能力有限,所以加入了扩展正则表达式;

比如说有这么一段字符串:“A=1,B=2,C=3,D=4“

我们计划把B的值提取出来,用基础正则匹配“B=”和","中间的,但是却提取出“2,C=3“

这时候需要拓展正则表达式中的贪婪模式(尽可能多)和非贪婪模式(尽可能少)来解决

加入扩展正则表达式,在基础正则表达式的匹配结果上进一步进行过滤。

在线验证正则表达式的工具:

https://tool.oschina.net/regex/

https://regex101.com/

二、不同编程语言下的应用

1、C语言

在c语言中,用regcomp、regexec、regfree 和regerror处理正则表达式。处理正则表达式分三步:

①编译正则表达式,regcomp

②匹配正则表达式,regexec

③释放正则表达式,regfree

/*
函数说明:Regcomp将正则表达式字符串regex编译成regex_t的形式,后续regexec以此进行搜索。
参数说明:Preg:一个regex_t结构体指针。Regex:正则表达式字符串。Cflags:是下边四个值或者是他们的或(|)运算。REG_EXTENDED:使用POSIX扩展正则表达式语法解释的正则表达式。如果没有设置,基本POSIX正则表达式语法。REG_ICASE:忽略字母的大小写。REG_NOSUB:不存储匹配的结果。REG_NEWLINE:对换行符进行“特殊照顾”,后边详细说明。
返回值:0:表示成功编译;非0:表示编译失败,用regerror查看失败信息
*/
int regcomp(regex_t *preg, const char *regex, int cflags);/*
函数说明: Regexec用来匹配正则文本。
参数说明:Preg:由regcomp编译好的regex_t结构体指针,String:要进行正则匹配的字符串。Nmatch:regmatch_t结构体数组的大小Pmatch:regmatch_t结构体数组。用来保存匹配结果的子串位置。regmatch_t结构体定义如下typedef struct {regoff_t rm_so;regoff_t rm_eo;} regmatch_t;rm_so,它的值如果不为-1,表示匹配的最大子串在字符串中的起始偏移量,rm_eo,表示匹配的最大字串在字符串的结束偏移量。Eflags: REG_NOTBOL和REG_NOTEOL为两个值之一或二者的或(|)运算,稍后会介绍。
返回值:0:表示成功编译;非0:表示编译失败,用regerror查看失败信息
*/
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);/*
函数说明:用来释放regcomp编译好的内置变量。
参数说明:Preg:由regcomp编译好的regex_t结构体指针。
*/
void regfree(regex_t *preg);/*
函数说明:Regcomp,regexec出错时,会返回error code并且为非0,此时就可以用regerror得到错误信息。
参数说明:Errcode:Regcomp,regexec出错时的返回值Preg:经过Regcomp编译的regex_t结构体指针。Errbuf:错误信息放置的位置。errbuf_size:错误信息buff的大小。
*/
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
//比如字符串:<html>value</html>,想要匹配固定字符之间的内容:#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>int main (void)
{char ebuff[256];   //装载错误信息int ret;            int cflags;regex_t reg;cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;char *test_str = "Hello World";char *reg_str = "H.*";ret = regcomp(&reg, reg_str, cflags); //编译if (ret) {   //编译失败regerror(ret, &reg, ebuff, 256);fprintf(stderr, "%s\n", ebuff);regfree(&reg);return -1;}   ret = regexec(&reg, test_str, 0, NULL, 0); //匹配if (ret) {  //匹配失败regerror(ret, &reg, ebuff, 256);fprintf(stderr, "%s\n", ebuff);regfree(&reg);return -1;}   regerror(ret, &reg, ebuff, 256); //装载匹配成功结果fprintf(stderr, "result is:\n%s\n", ebuff);regfree(&reg);   //释放return 0;
}

2、C++

在C++中利用正则表达式需要regex库,在头文件<regex>中包含了多个我们使用正则表达式时需要用到的组件,大致有:

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对象中

//比如字符串:Hello_2018#include <iostream>
#include <string>
#include <regex>
using namespace std;int main()
{string str = "Hello_2018";smatch result;regex pattern("(.{5})_(\\d{4})"); //匹配5个任意单字符 + 下划线 + 4个数字if (regex_match(str, result, pattern)){cout << result[0] << endl;     //完整匹配结果,Hello_2018cout << result[1] << endl;        //第一组匹配(括号)的数据,Hellocout << result[2] << endl;       //第二组匹配(括号)的数据,2018//result[]与result.str()这两种方式能够获得相同的值cout<< result.str() << endl;  //完整结果,Hello_2018cout<< result.str(1) << endl;   //第一组匹配(括号)的数据,Hellocout << result.str(2) << endl;   //第二组匹配(括号)的数据,2018}
}

3、Python

实现网络爬虫必然离不开正则表达式,Python的正则表达式主要用re库实现。

移步专业教程:https://www.runoob.com/python/python-reg-expressions.html

//比如字符串:<html>value</html>,想要匹配固定字符之间的内容:import re
str='<html>value</html>'
pattern=re.compile('<html>(.*)</html>')   #匹配<html>与</html>之间的内容
result=pattern.findall(str)
print(result)//贪婪和非贪婪匹配
str = "a123b456b"print re.findall(r"a(.+?)b", str)
#输出['123']#?控制只匹配0或1个,所以只会输出和最近的b之间的匹配情况print re.findall(r"a(.+)b", str)
#输出['123b456']print re.findall(r"a(.*)b", str)
#输出['123b456']//多行匹配
str = "a23b\na34b"re.findall(r"a(\d+)b.+a(\d+)b", str)
#输出[]
#因为不能处理str中间有\n换行的情况re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)
#s输出[('23', '34')]

4、Shell

表达式在Linux编程中很常用,Shell脚本编程,文本处理的3把瑞士军刀sed,awk和grep都离不开正则表达式。Shell脚本中正则表达式的应用,可以参考我写的关于sed命令的文章。

正则表达式(C、C++、Python、Shell)相关推荐

  1. 正则表达式 (re包)——python(快餐)

    开始:正则表达式 (re包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我将从正则表达式开始讲Python的标准库.正则表达 ...

  2. python shell背景颜色改变_科学网—Python Shell Background Color - 李旭的博文

    ArcGIS在安装时就已经默认在本机安装了Python.可是,Python Shell的界面看起来太亮了,对眼睛不太好啊,如图1. 图1 在网上搜索一番,之前也有和我同样问题的帖子,不过,时间有点久了 ...

  3. 解决 Python shell 中 Delete/Backspace 键乱码问题

    简述 进入 Python shell,按下 Delete/Backspace 键,会出现 ^H 字符.命令输入错误后只能从头开始,无法删除,让人很头疼.为了便于后期使用,分享一个一劳永逸的方式. 基本 ...

  4. IPython、python shell(command line)、pycharm,python,python IDLE的区别是什么?

    文章目录 IPython vs python shell pycharm vs python IDLE 首先,最容易区别的就是python,这个是编程语言,相当于是一个解释器,是后端.其他四个都是前端 ...

  5. 清空Python Shell 窗口的方法 - ClearWindow

    简 介: 通过增加ClearWindow菜单选项以及快捷键,完成Python Shell中的内容清空功能.过程分为两个步骤.经过测试,可以证明该步骤是可以工作的. 关键词: Idle,Python,S ...

  6. 交互式python shell

    参考: 命令行版本的Python Shell – Python (command line) 带图形界面的Python Shell – IDLE (Python GUI) GUI

  7. python实用性函数分享_分享|3个开源的 Python Shell

    Python是一个高级.通用.结构化且强大的开源编程语言,广泛用于各种编程工作.它拥有一个全动态类型系统和自动内存管理,与Scheme,Ruby,Perl和Tcl的十分相似,避免编译型语言的许多复杂地 ...

  8. C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。

    C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...

  9. python代码没有错误却无法运行的原因-Python shell没有显示错误,但程序没有运行...

    我写了这个程序来学习OOP的基础知识.当我在Python Shell中从IDLE运行这个程序时,它没有显示任何错误但也没有打印任何东西......我不知道如何去弄清楚我的错误是什么. 这是我的代码:c ...

  10. python自带的shell是什么-python shell是什么东西

    python shell是Python的命令行. shell中最常用的是ls命令,python对应的写法是:os.listdir(dirname),这个函数返回字符串列表,里面是所有的文件名,不过不包 ...

最新文章

  1. ant models 内获取 url 的参数传递到组件
  2. 刚安装的python如何使用-python中RabbitMQ的使用(安装和简单教程)
  3. 2022年美国大学生数学建模竞赛O奖流程图
  4. latex换页_备忘 | Latex 双栏模式下表格太长怎么办?
  5. vxworks gcc linux,针对VxWorks的GCC交叉编译器无法编译C++
  6. ZooKeeper管理分布式环境中的数据
  7. MplusAutomation包的使用 二
  8. StringUtil工具类之去除所有的空白字符
  9. 人脸检测进阶:使用 dlib、OpenCV 和 Python 检测眼睛、鼻子、嘴唇和下巴等面部五官
  10. EMC VMAX控制台更换指南
  11. 虚拟机启动黑屏_模拟器启动失败解决方法
  12. java的测试岗位_JAVA测试岗位职责
  13. 135编辑器使用教程
  14. bugku CTF杂项wp(1)
  15. java 阈值 告警_处理Java异常告警最佳实践
  16. android实训报告ppt,ppt实验报告总结
  17. 2021年影响谷歌Google排名的因素有哪些?
  18. 讨论-职场中年人,你的危机感都来源于哪里
  19. 多台主机共享一套鼠标键盘(跨屏鼠标键盘)
  20. POJ 2142-The Balance(扩展欧几里德)

热门文章

  1. 第七章 集成方法-随机森林和AdaBoost
  2. dbd mysql dbi_MySQL的DBI/DBD简明安装手册
  3. 新京报:区块链投资绝不能只听“演员的”
  4. 列主元素消去法的Matlab实现
  5. 满分回答教你如何应对面试中项目经验这一难关
  6. Java 8 Stream流 的用法
  7. 微信小程序-人脸识别+输出人脸匹配信息
  8. 腾讯开放平台 iOS应用URL schema、Bundle ID填写 (含微博、微信)
  9. 抽象代数之群同态基本定理的证明之群同态的核是群G的正规子群
  10. ntp和chrony