如何用C语言的正则表达式匹配到C语言中的函数实现部分的函数头部分。

C代码

int test1(int a, int b){

int a;

int b;

}

匹配到
C代码 收藏代码
int test1(int a, int b)

1个回答

简单的来说,我们假定函数的原型是
返回值+若干空格+函数名+前括号+可选第一个参数+可选多个参数+后括号 组成的。其中返回值、函数名、参数类型、参数名都是标示符

这样匹配一般的代码应该没问题了。

参考:

[a-zA-Z_\-][a-zA-Z0-9_\-]*\s+[a-zA-Z_\-][a-zA-Z0-9_\-]*\s+\(([a-zA-Z_\-][a-zA-Z0-9_\-]*\s+[a-zA-Z_\-][a-zA-Z0-9_\-]*\s+(\,[a-zA-Z_\-][a-zA-Z0-9_\-]*\s+[a-zA-Z_\-][a-zA-Z0-9_\-]*\s+)*){0,1}\s+\)

但是这个肯定是不严谨的。C语言里因为有宏的存在,还有关键字,所以非常复杂,除非写一个完整的语法分析程序,否则不能搞定。
看下面的例子:

#include <stdio.h>
#define FBRK (
#define RBRK )
int TEST1 FBRK int a, int b RBRK
{
return a+b;
}
int main FBRK RBRK
{
   printf("%d", TEST1(1,2));

   return 0;
}

显然,这个程序是合法的,而且要解析它,必须理解括号的替换。

情况可能复杂,如果define写在了头文件里呢?那么还得根据头文件找到另一个文件,才能解析。

dwandqq
dwandqq 我想先定位到函数头,然后再匹配,不知道该如何从整个文本中定位到函数头?
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何用正则表达式匹配到C语言中的函数实现部分的函数头部分。
比如 rn1)rn[code="c"]rnint test1(int a, int b)rn int a;rn int b;rnrn[/code]rn匹配到 rn[code="c"]int test1(int a, int b)[/code]rnrn2)rn[code="c"]rnint test1(int a, int b)rnrn int a;rn int b;rnrn[/code]rn匹配到rn[code="c"]rnint test1(int a, int b)rnrn[/code]rn3)rn[code="c"]rnint test1(int a,rn int b)rn int a;rn int b;rnrn[/code]rn匹配到rn[code="c"]rnint test1(int a,rn int b)rn[/code]rnrn这个正则表达式该如何写?
C语言中可变参数函数实现
C99版本加入可变参数列表概念。用于实现函数参数的变长传递。#include<stdarg.h>中定义了相关方法。 typedef struct { char *ao; //起始地址 int offset;//相对偏移量 }va_list;控制函数: void va_start( va_list arg_ptr, prev_param ); //创建 type va_arg(
C语言中部分需要知道的常识
1.转义字符:在特定的字符前面加“/”以改变其本来含义从而拥有另外的意思         \ddd:表示1~3个八进制的数字,如\130 表示1*8^2+3*8^1+0*8^0所代表的的字符。         \ddd:同理。2.数据类型        数据类型有char ,short ,int ,long ,float ,double 等。        类型决定在定义这个类型变量的时候所开辟空...
C语言中自定义类型部分知识总结
什么是自定义类型? 所谓自定义类型,就是除去基本类型,用户可以自己定义的一些类型,一般自定义类型包含三种:结构体、枚举、联合。 结构体 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 如: struct Student//类型声明 { char name[1024];//名字 int age;//年龄 char sex[1024];//性别 char id[1024]...
C语言中部分字符串处理函数
#include #include #include #include #include using namespace std; //strchr函数,查找第一个出现的字符的位置 int main() { char p1[] = "adfshfekjfklszi"; char p2 = 'z'; char *p = strchr(p1,p2); co
c语言中部分字符串操作函数
c语言中部分字符串操作函数
C语言中字符数组操作的函数实现(C语言实现)
NULL 博文链接:https://touch-2011.iteye.com/blog/1038925
如何在C语言中使用正则表达式
查阅了百度,借鉴了许多大牛的代码,自己的整理如下: #include #include #include #include using namespace std; int main() { //例1:从中提取tom const char* url = ""; char uri[10] = {0}; sscanf(url, "%*[^:]:%[^@]", uri
如何在C语言中巧用正则表达式
看到大家讨论这方面的东西,作点贡献聊表各位高手对这个版快的无私奉献 rnrn如果用户熟悉Linux下的sed、awk、grep或vi,那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂度,因此现在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利,作为C语言程序员,用户同样可以在自己的程序中运用正则表达式。 rnrn标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。 rnrn编译正则表达式 rnrn为了提高效率,在将一个字符串与正则表达式进行比较之前,首先要用regcomp()函数对它进行编译,将其转化为regex_t结构: rnrnint regcomp(regex_t *preg, const char *regex, int cflags);rnrnrnrn参数regex是一个字符串,它代表将要被编译的正则表达式;参数preg指向一个声明为regex_t的数据结构,用来保存编译结果;参数cflags决定了正则表达式该如何被处理的细节。 rnrn如果函数regcomp()执行成功,并且编译结果被正确填充到preg中后,函数将返回0,任何其它的返回结果都代表有某种错误产生。 rnrn匹配正则表达式 rnrn一旦用regcomp()函数成功地编译了正则表达式,接下来就可以调用regexec()函数完成模式匹配: rnrnint regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch[], int eflags);rntypedef struct rn regoff_t rm_so;rn regoff_t rm_eo;rn regmatch_t;rnrnrnrn参数preg指向编译后的正则表达式,参数string是将要进行匹配的字符串,而参数nmatch和pmatch则用于把匹配结果返回给调用程序,最后一个参数eflags决定了匹配的细节。 rnrn在调用函数regexec()进行模式匹配的过程中,可能在字符串string中会有多处与给定的正则表达式相匹配,参数pmatch就是用来保存这些匹配位置的,而参数nmatch则告诉函数regexec()最多可以把多少个匹配结果填充到pmatch数组中。当regexec()函数成功返回时,从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串,而从string+pmatch[1].rm_so到string+pmatch[1].rm_eo,则是第二个匹配的字符串,依此类推。 rnrn释放正则表达式 rnrn无论什么时候,当不再需要已经编译过的正则表达式时,都应该调用函数regfree()将其释放,以免产生内存泄漏。 rnrnvoid regfree(regex_t *preg);rnrnrnrn函数regfree()不会返回任何结果,它仅接收一个指向regex_t数据类型的指针,这是之前调用regcomp()函数所得到的编译结果。 rnrn如果在程序中针对同一个regex_t结构调用了多次regcomp()函数,POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放,但建议每次调用regcomp()函数对正则表达式进行编译后都调用一次regfree()函数,以尽早释放占用的存储空间。 rnrn报告错误信息 rnrn如果调用函数regcomp()或regexec()得到的是一个非0的返回值,则表明在对正则表达式的处理过程中出现了某种错误,此时可以通过调用函数regerror()得到详细的错误信息。 rnrnsize_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);rnrnrnrn参数errcode是来自函数regcomp()或regexec()的错误代码,而参数preg则是由函数regcomp()得到的编译结果,其目的是把格式化消息所必须的上下文提供给regerror()函数。在执行函数regerror()时,将按照参数errbuf_size指明的最大字节数,在errbuf缓冲区中填入格式化后的错误信息,同时返回错误信息的长度。 rnrn应用正则表达式 rnrn最后给出一个具体的实例,介绍如何在C语言程序中处理正则表达式。 rnrn#include ;rn#include ;rn#include ;rnrn/* 取子串的函数 */rnstatic char* substr(const char*str, unsigned start, unsigned end)rnrn unsigned n = end - start;rn static char stbuf[256];rn strncpy(stbuf, str + start, n);rn stbuf[n] = 0;rn return stbuf;rnrn/* 主程序 */rnint main(int argc, char** argv)rnrn char * pattern;rn int x, z, lno = 0, cflags = 0;rn char ebuf[128], lbuf[256];rn regex_t reg;rn regmatch_t pm[10];rn const size_t nmatch = 10;rn /* 编译正则表达式*/rn pattern = argv[1];rn z = regcomp(®, pattern, cflags);rn if (z != 0)rn regerror(z, ®, ebuf, sizeof(ebuf));rn fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern);rn return 1;rn rn /* 逐行处理输入的数据 */rn while(fgets(lbuf, sizeof(lbuf), stdin)) rn ++lno;rn if ((z = strlen(lbuf)) >; 0 && lbuf[z-1] == '\n')rn lbuf[z - 1] = 0;rn /* 对每一行应用正则表达式进行匹配 */rn z = regexec(®, lbuf, nmatch, pm, 0);rn if (z == REG_NOMATCH) continue;rn else if (z != 0) rn regerror(z, ®, ebuf, sizeof(ebuf));rn fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf);rn return 2;rn rn /* 输出处理结果 */rn for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x) rn if (!x) printf("%04d: %s\n", lno, lbuf);rn printf(" $%d='%s'\n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));rn rn rn /* 释放正则表达式 */rn regfree(®);rn return 0;rnrnrnrnrn上述程序负责从命令行获取正则表达式,然后将其运用于从标准输入得到的每行数据,并打印出匹配结果。执行下面的命令可以编译并执行该程序: rnrn# gcc regexp.c -o regexprn# ./regexp 'regex[a-z]*' < regexp.crn0003: #include ;rn $0='regex'rn0027: regex_t reg;rn $0='regex'rn0054: z = regexec(®, lbuf, nmatch, pm, 0);rn $0='regexec'rnrnrnrn小结 rnrn对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具。本文重点在于阐述如何在C语言中利用正则表达式来简化字符串处理,以便在数据处理方面能够获得与Perl语言类似的灵活性。 rnrnhttp://bbs.chinaunix.net/viewthread.php?tid=303346&extra=page%3D1%26filter%3Ddigest
C语言中如何用exit退出程序?
用exit(0)行吗?我试了,好像不行,那应该怎么退出?请多多指教!
C语言中巧用正则表达式
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。
正则表达式 c语言中的注释/* */
c语言中的注释/* */rn的正则表达式 怎么写啊?rn谢谢 注释中间可以是任何字符rn谢谢
C语言中如何用OpenGL编程?
C语言究竟可不可以使用OpenGL编程?网上多的是VC++的,delphi的等等rn可我就是不想学VC++,用C语言又不知道怎么初始化设置,好痛苦的。rn比方说VC++中,是这样设置的:rn1.将glut.dll和glut32.dll拷贝到windows\system32目录下。rn2.将glut.h拷贝到集成环境安装目录的include\gl子目录下(如果不存在gl子目录,则创建它)。rn3.将glut32.lib拷贝到集成环境安装目录的lib子目录下.rn请进门的指点指点啊......rn
在C语言中使用正则表达式
在C语言中使用正则表达式,很不错的。
在C语言中巧用正则表达式
在C语言中巧用正则表达式
正则表达式在C 语言中的运用
我在用C语言写正则表达式时,出现了找不到#include 头文件,是不是有什么方法在纯C中实现正则表达式。不是LINU
C语言中使用正则表达式
int regcomp(regex_t *preg, const char *regex, int cflags); 说明 当正则表达式regex,不符合正则表达式语法规范时,regcomp函数调用会失败。否则,regcomp函数调用成功,并将编译好的结果存放在preg参数中,以便后序使用。 参数 preg:字符串regex编译成preg,preg作为输出参数 正则表达式串regex 标志位cf...
C语言程序设计函数头文件库
C语言中的头文件有多少种?都有哪些?C函数库有哪些?
正则表达式在C语言中的应用
正则表达式的C语言示例程序,进行编译后执行./regex "正则表达式" 想要查找的文件
正则,为什么只匹配到前面部分
[code=Java]rnimport java.util.*;rnimport java.io.*;rnimport java.util.regex.*;rnrnpublic class studentrn public static void main(String[] args)rn String ss=new String("小杯:0.10 中杯:0.15");rn Matcher m=Pattern.compile("^[\\u4e00-\\u9fa5]+").matcher(ss);rn while(m.find())rn System.out.println(m.group());rn rn rnrn输出结果:小杯rnrn[/code]
C之诡谲-介绍c语言中极其灵活的部分
C++的前世是C,而且C所留下的神秘以及精简在C++中是青出于蓝而胜于蓝!C所带 给人的困惑以及灵活太多,即使一个有几年经验的高段C程序员仍然有可能在C语言 的小水沟里翻船。不过其实C语言真的不难,下面我想指出C语言中最神秘而又诡谲 多变的四个地方,它们也继续在C++语言中变幻莫测。 指针,数组,类型的识别,参数可变的函数。
利用C语言中的函数实现文件的Copy
2.读写   (1).按字符进行读写操作   fgetc        int fgetc(FILE *stream);        参数:           @stream 流指针        返回值:           成功 返回对应字符的int值           失败 返回EOF(end of file) 实际上是一个结束标志 在文件本身并不存在   fputc
c语言中strmcpy的非函数实现
遇到这样一个题目,题目如下:rn请在不调用C的字符串函数库的条件下,完成类似strmcpy函数的功能。rn此函数有3个参数:rn参数一:目标字符串rn参数二:源字符串rn参数三:拷贝字符的个数rn此函数需支持链式表达式。rn并写一段测试程序验证该的函数的功能。rn 我知道可能有很多方法,但我用指针写了一个,也是错的,而且链式表达也不是很明白,想请教高手一下,如何用最简单的方法实现这个函数的功能呢?rn
c语言中的for循环语言
这是有关c语言中的for循环语言的教师课件
C语言中的结构体------>C语言的实体
C语言中的结构体——>C语言的实体1.结构体概念 2. 结构体声明 3. 结构体定义 5. 结构体变量成员的引用 6. 结构体变量的赋值 7. 结构体变量的初始化 8. 结构体的嵌套结构体的概念:C语言中引入了一种构造出句类型成为结构体,他是由若干个成员构成,成员本身可以是基本数据类型,也可以是其他构造类型,他相当与高级语言中的记录,类似与java高级语言中的实体类。可以表示
【c语言】C语言中的坑
1.输出数据所占宽度 1.float a=12.346; printf(&quot;%4.2f\n&quot;,a);//12.35 输出数据多于n2位,截去右边多余的小数,并对截去部分的第一位小数做四舍五入处理 2.float a=12.346; printf(&quot;%.3f&quot;,a);//12.346不指定总宽度,仅指定小数位,其他有系统自动突破 3.float a=12.346; printf(&quot;%3...
C语言中$$如和理解
Prepare_Copy((uint32_t *)&Load$$RW_IRAM1$$Base,(uint32_t *)&Image$$RW_IRAM1$$RW$$Base,(uint32_t)&Image$$RW_IRAM1$$RW$$Length);rn Prepare_Zero((uint32_t *)&Image$$RW_IRAM1$$ZI$$Base,(uint32_t)&Image$$RW_IRAM1$$ZI$$Length);rn谁帮我看看中间的$$什么意思,怎么理解,谢谢
C语言部分关键字
1.      static: 修饰局部变量(只在初次运行时,进行初始化工作)  全局变量(只是本.c文件可见)   函数(类似于全局变量) 2.      extern:编译器并不匹配extern的函数的参数列表,只做函数名匹配! 3.      typedef:重定义过的数据类型,对于typedef char* newC;   newC a,b;,这时候会将a b都定义为char *,而使
C语言指针部分
该文档讲的主要是关于C语言指针方面的讲解,值得查看,很经典,很不错,是ppt格式
c语言部分函数
内含c语言部分函数,可作为C语言学习编程资料
c语言--函数部分
重点掌握 1.库函数 2.自定义函数 3.函数参数 4.函数调用 5.函数声明和定义 6.函数递归 1.库函数 库函数是c语言中提供给程序员用来实现一系列基础功能,方便程序员进行软件开发。 常见的库函数 io函数 printf()sacnf() 字符串操作函数strlen()strcmp() 内存操作函数 memset()memcpy() 每个库函数都对应相应的头文件,使用库函数必须引相应...
正则表达式[比较]怎么匹配到
正则表达式[比较]怎么匹配到rn主要是中括号的问题,我估计,大神求救,急用
C语言-文件操作函数(部分)
FILE *fopen(const char *path,const char *mode); 第一个参数就是文件的路径名 第二个参数表示文件的打开模式 Int fclose(FILE *fp); 当文件关闭成功是返回0,失败时返回一个非零值。   按字符读写文件: Int fgetc(FILE *stream); Int getc( FILE *stream);
C语言部分题目解析
C语言部分题目解析 1、有以下程序 #include int main () { int i = 1, j = 2, k = 3; if (i++ ==1 || (++j == 3 || k++ == 3)) printf(“%d%d%d\n”, i, j, k); return 0; }
C语言,函数部分
求和函数#include<stdio.h> void sum(int begin, int end) { int i; int sum = 0; for ( i=begin; i<=end; i++){ sum += i; } printf("%d到%d的和是%d\n", begin, end, sum); }int main() {
基本概念(部分 、C语言)
-------------------学习笔记 1.基本数据类型大小 c语言: 基本数据类型大小/(byte) 32位系统 64位系统 char 1 1 short 2 2 int  4 8 long 4 8 float 4 4 double 8 8 各种指针类型
c语言必学部分
要想把c语言学精就必须看这本书
千方百计c语言部分
C语言的一些常见,但是又比较容易出错的资料,适合那些对C语言很多概念模糊的程序员学习!
部分C语言运算符优先级
-
C语言部分常用算法
编译环境:VS2017 注:本文所有代码都是参考网上其他博客代码,再加以改进整理写成的。 1. 八进制转十进制   #pragma warning(disable : 4996) #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt; int main() { int n; int i = 0; int result = 0;...
相关热词 c# login 居中 c# 考试软件 c# 自然语言分析 c# 分段读取文件 c# 泛型反射 c#打断点 c# 时间转多少秒 c# 线程函数加参数 c# modbus 读取 c#查询集合表