正则表达式

正则表达式是用来描述某种规则的字符串的表达式。
脱离了具体语言的一些规则,但是现在大多数程序设计语言都实现了
支持正则表达式:
C语言
python
C++
C#
java

但是每种语言实现正则表达式的规则略有不同。

正则表达式的规则
如:

     十进制数字字符串[0-9]+

正则表达式也叫做 匹配模式(pattern),它是由一组特定含义的字符串组成,通常用于匹配和替换文本。

正则表达式中的字符,分为两种:

 (1) 普通字符: 只代表自己本身的字符0 ~ 9  a~z  A~Z (2) 元字符: 有特定含义(不代表自己)的字符 + *

正则表达式中的元字符:

.    匹配任意单个字符 [] 字符组。匹配任意一个十六进制的字符。
[0123456789abcdefABCDEF]
[]仅匹配括号内的一个字符。'-'在[]内用于链接ASCII连续的字符
匹配任意一个十六进制的字符。
[0-9a-fA-F]  

匹配单个字符

[^]  排除字符组。匹配单个字符,匹配除[]内意外的所有单个字符。 如: 非十进制数字字符 [^0-9]\d   digtial 匹配单个十进制数字字符 \d <=> [0-9]\D   匹配单个非十进制数字字符 \D <=> [^0-9]\w word 匹配单个单词中能够出现的字符字母、数字、_ \w <=> [0-9a-zA-Z_]  \W   非字母、数字、_ 中的单个字符\W <=> [^0-9a-zA-Z_]\s    space 匹配单个空白符 \s <=> [\f\n\r\t\v]\S  匹配单个非空白符 \S <=> [^\f\n\r\t\v]  例子:  [a-c^0-9] 匹配单个的 a-c 、0-9 、^

匹配多个字符

+   匹配一个或多个先前字符 或 模式
09+ ==   09099099909999........ *    匹配0个或多个先前字符 或 模式
?   匹配0个或1个先前的字符 或 模式 {数字}  匹配固定数目的字符 或 模式
88[0-9]{3}== 88[0-9][0-9][0-9]{最小数目, 最大数目}         匹配至少"最下数目",到"最大数目"的先前字符或模式
8{1, 3} ==888888 {最小数目, }     匹配至少"最小数目",上不封顶 的先前字符 或 模式。        ()  作为一个整体,子模式
(abc){1,3}==abc abcabcabcabcabc (|)   二选一

转义元字符
\元字符 => 元字符它就不是元字符,就是这个字符本身含义。

                 \. 代表一个普通字符'.' \* 代表一个普通字符'*'\+ 代表一个普通字符'+'\? 代表一个普通字符'?' ......

C语言对应的正则表达式函数

regcomp: 用来编译正则表达式
编译好的正则表达式用类型 regex_t 来表示。

#include <sys/types.h>
#include <regex.h>
int regcomp(regex_t * preg, const char *regex, int cflags);@preg : 指向的地址空间,用来保存编译好了的正则表达式的a、regex_t reg;&reg  b、regex_t * preg = (regex_t *)malloc(sizeof(*preg));preg @regex :指向原始的待编译的正则表达式 @cflags: 有如下标志,用位域实现  '|'REG_EXTENDED : 用扩展的正则表达式的语法来进行编译 REG_ICASE : ignore case 忽略大小写 REG_NOSUB : 不包含子模式如: 既要使用扩展的正则表达式语法 也要忽略大小写 =>    REG_EXTENDED | REG_ICASE 返回值: 成功返回0 失败返回一个错误码,该错误码需要调用 regerror去解析。

regexec : 用来匹配正则表达式所描述的模式
匹配的结果用 regmatch_t 来描述,返回的是母串中匹配到的下标的范围。[起始下标 ,结束下标)

 int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch[], int eflags); @preg : 指向编译好了的正则表达式     @string : 原始的待匹配的母字符串。带查找的字符串@nmatch : 正则表达式中有多少个模式 总模式 + 子模式 @pmatch : 模式匹配信息 数组 数组元素个数 : nmatch 一个模式匹配 就需要用一个regmatch_t结构体变量......总共有多少个模式,就需要有多少个regmatch_t@eflags : 标志是否匹配行首或行尾 一般是填0 返回值: 成功(匹配到了)返回0 如果一个待匹配的字符串中,匹配成功多个模式,如何去查看匹配到的信息(结果)? 循环 访问 regmatch_t pmatch[ nmatch ] 数组中的元素。 如果失败返回 REG_NOMATCH

regerror :用来把regcomp / regexec 执行返回的错误码,转换成相应的无措字符串信息。

 size_t regerror(int errcode, const regex_t *preg, char *errbuf,size_t errbuf_size);@errcode : 错误码。由regcomp / regexec返回的值 @preg : 编译好了的正则表达式 @errbuf: 指向一个存储空间,这个存储空间是用来保存出错信息。@errbuf_size : 表示errbuf的大小。 返回值:  返回填充到errbuf中的错误提示字符串的长度。

regfree :用来释放preg指向的空间

void regfree(regex_t *preg);

写一个函数,判断一个字符串是否为一个IP字符串?

int Is_IPString(char * p){}待查找的字符串(母串): abc192.168.31.67abcdefgee 总模式: 192.168.31.67[3,16) 子模式: 192 [3,6) 子模式: 67 [14,16)

代码如下:

#include<stdio.h>
#include<sys/types.h>
#include<regex.h>
#include <string.h>#define IP_REG "([0-9]{1,3})\\.[0-9]{1,3}\\.[0-9]{1,3}\\.([0-9]{1,3})"
#define IP_STR "abc192.168.1.1qqqq"void Is_IPString(char* string)
{int ret;//保存错误码regex_t reg;//保存编译好的正则表达式regmatch_t pmatch[3];//保存匹配到的模式char buf[512];//保存出错信息memset(buf,0,512);ret=regcomp(&reg,IP_REG, REG_EXTENDED | REG_ICASE);//编译正则表达式if(ret==0){ret=regexec(&reg,string, 3, pmatch, 0);//匹配正则表达式所描述的模式if(ret==REG_NOMATCH){regerror(ret,&reg,buf,512);//返回错误码printf("error :%s\n",buf);}else{int i,j;for(i  = 0; i < 3; i++){printf("[%d, %d)\n", pmatch[i].rm_so , pmatch[i].rm_eo);//取pmatch下标for(j = pmatch[i].rm_so ; j < pmatch[i].rm_eo ; j++){printf("%c", string[j]);}printf("\n");}}}else{regerror(ret , &reg, buf, 512); printf("error : %s\n",  buf);}regfree(&reg);//释放空间}int main()
{Is_IPString(IP_STR);return 0;
}

正则表达式以及在C语言中调用相关函数相关推荐

  1. f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码

    f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码 分类: Python Numpy_Scipy fortran MinGW_GCC_Boost f2py 2012 ...

  2. powershell执行c语言文件,c语言中调用shell脚本

    [转]c语言中调用shell脚本 关于在c语言中调用shell脚本,先是在百度上百度了一下 下面的这个应该是说的比较详细的 dreamerkxz.blog.163.com/blog/static/82 ...

  3. 易语言 存储过程 mysql_在易语言中调用MS SQL SERVER数据库存储过程(Transact-SQL)方法总结...

    作者:liigo 日期:2010/8/25 Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接 ...

  4. gnuplot用C语言程序画图,c语言中调用gnuplot

    this.p={ m:2, b:2, loftPermalink:'', id:'fks_080064087085082068082081082095083086088068085081080068' ...

  5. c语言中调用函数fn,C语言常见的函数调用

    C语言常见的函数调用 isatty,函数名,主要功能是检查设备类型,判断文件描述词是否为终端机. 函数名: isatty 用 法: int isatty(int desc); 返回值:如果参数desc ...

  6. MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)

    ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object ...

  7. c语言正则表达式测试数字,C语言中使用正则表达式

    POSIX 规定了正则表达式的C语言库函数, 参见regex(3), 我们已经学了很多C函数得用法  读者应该具备自己看懂man手册得能力 C语言中使用正则表达式一般分为三部: 1.编译正则表达式re ...

  8. c语言正则表达式 windows,在C语言中使用正则表达式.doc

    在C/C++语言中使用正则表达式 本文所有的内容都来自网络,加上一些个人的理解,不保证正确性,欢迎批评指正,Email/MSN: caijimin@说起正则表达式(Regular Expression ...

  9. c语言中调用一个程序设计,第一章 C语言程序设计概述

    1 计算机体系结构 计算机主要由硬件和软件的协作完成生活和工作中的绝大多数事情,例如听音乐,看电影,上网聊天,购物等等. 硬件主要包含CPU,内存,外存,IO设备等组成. CPU:负责从内存中读取进程 ...

最新文章

  1. 基于链表实现队列(基于Java实现)
  2. 【zepto学习笔记01】核心方法$()
  3. C# MD5加密解密帮助类
  4. 综合操作篇 NAT 和trunk和dhcp综合应用
  5. 2021年图灵奖公布!72岁的美国科学家 Jack Dongarra 获奖
  6. dtft变换的性质_[2018年最新整理]DTFT变换.ppt
  7. iOS病毒门还没完:美国210家企业仍在用感染App
  8. 3.3 基于GMM-HMM的语音识别
  9. qgis自定义符号库
  10. 学python-当当发布2020程序员新态:左手Python,右手机器学习
  11. oppo X907刷机包 COLOROS 1.0 正式版发布 安卓4.2.2
  12. Android Studio入门级教程(详细)【小白必看】
  13. PPT计算机原理结构初步,测量实践初步(赖丽娟).ppt
  14. SpringBoot项目在使用Maven打包war中遇到的问题
  15. php中$this-是什么意思
  16. 秒杀年费258的同款APP,微软、联想、Adobe、腾讯的这些良心产品太香了
  17. bootstrap之data-toggle,data-dismiss,data-target用法
  18. matlab--handles结构体及用法(转载)
  19. 1分钟为Win10瘦身!把吃掉的硬盘找回来
  20. ArcGIS入库操作

热门文章

  1. 计算任何两个时刻的时间差(精确到毫秒)
  2. A Self-Attentive model for Knowledge Tracing
  3. link[rel=“icon“]
  4. 举出其他监督学习,无监督学习,强化学习的例子?说一下非显著式编程的优势?AlphaGo的胜利,带给我们什么样的人生启示?当代大学生如何在人工智能时代增加自己的核心竞争力?
  5. android华为怎么截屏快捷键,华为p10怎么截图 华为p10截屏的三种方法
  6. sqlserver字符串拆分(split)方法汇总
  7. dnfdpl服务器维护了,DNF5月dpl奖励“暗改”:强化器、时空石没了,史派克逼退玩家...
  8. JS变量提升和函数提升的顺序
  9. 听说写博客是程序猿学习的第一步
  10. JS 数组去重的4个方法