网站首页 > 文章中心 > 其它

c语言正则表达式函数_linux c语言正则表达式

作者:小编 更新时间:2023-08-16 14:29:31 浏览量:455人看过

用C语言完成一个正则表达式的匹配: 字符串中只有*和?是可变字符且位置和个数不固定,其他的字符位置固定

#includestdio.h

#includestring.h

#include stdlib.h

//1、'?'很好处理,只要在原有的定位函数中加一点点就行:

int index(char *s,char *t,int pos)

{

int i=pos,j=0,lens=strlen(s),lent=strlen(t);

while(ilensjlent)

if(s[i]==t[j]||t[j]=='?')

◆◆i;

◆◆j;

}

else

i=i-j◆1;

j=0;

if(j==lent)return i-lent;

else return -1;

拿这些子串依次匹配S串.

按这样的方法可以把S串分成两类:

二者的差别只在于尾部是否有'*'.

拿T匹配S,

首先 T1匹配S头部,index(s,t1,0)==0

然后 用循环完成后面的匹配,从前一次匹配后的末尾位置开始向后匹配,

如果匹配成功再把末尾位置记录下来.这里只用了最左匹配,为什么就足够了呢?

比如实际中的情况T1串可能在S串不止出现一次,为什么只考虑最左一个呢?

因为整个匹配过程是从左向右,最左匹配可以保证余下的S子中最长,更有利于后面T子串的匹配成功,

试想如果T1最左匹配不成功,靠右一些有可能成功吗?

例:T="*is*a*" S="this is a program"

T 子串"is"在S中有出现两个位置,匹配的时候只需要考虑最左边那个"is"就行了,

因为最左边的"is"匹配成功后,余下的S子串是" is a program",余下的T子串是"*a",

最左匹配可使余下的S子串最长,匹配的可能最大,最容易匹配的情况已经验证了,

就不用再做无用功了.

*/

int match(char *s,char *t)

int i=0,j=0,lens=strlen(s),lent=strlen(t);

int bufp=0;

while(jlentt[j]!='*')

buf[bufp]=t[j];

◆◆bufp;◆◆j;

buf[bufp]='\0';

if(index(s,buf,0)!=0)return 0;

i=bufp;

while(1)

while(jlentt[j]=='*')◆◆j;

if(j==lent)return 1;

bufp=0;

if(j==lent)

if(index(s,buf,i)!=lens-bufp)return 0;

return 1;

if((i=index(s,buf,i))==-1)return 0;

i◆=bufp;

void main()

printf("输入字符串,进行匹配\n");

gets(s);

if(match(s,t))

printf("匹配\n");

printf("不匹配\n");

C语言怎么用正则表达式

合法的C语言表达式

引用 头文件 #include math.h

关于正则表达式在c语言中的使用问题

单看这个正则的意思是:

匹配以若干个(包括0个)空格或制表符开头,后跟一串不以"/"开头的字符.

显然这和你的要求不符.因为[^/]也可以匹配空白字符.比如:

空格//注释

你的本意是[:blank:]*匹配空格,[^/]不匹配"/"所以该行应该不匹配.

但是,实际的匹配过程没有在此打住:

正则回溯,这一次尝试[:blank:]*神马都不匹配,[^/]匹配空格,.*匹配剩余字符,于是这一行就被匹配了.

稍微改动就可以解决这个问题,^[:blank:]*[^\s/].*$其中\s匹配所有不可见字符,或许你也可以写成^[:blank:]*[^[:blank:]/].*$这种形式,再或者也可以写成只匹配注释的正则,再从不匹配的里面区分代码和空行.

正则表达式查找特定函数类型的函数(C语言)

函数定义double sqrt(x)

double x

....

return **

函数声明时,只用double sqrt()

函数定义double sqrt (x)

函数定义double sqrt( x )

函数定义double sqrt( _x )

函数定义double sqrt( x_ )

函数定义double sqrt( x_y )

函数定义double sqrt( _x, y )

函数定义double sqrt ( xy )

函数定义double sqrt( xy )

你的函数都有形参的么

egrep -in '[[:alpha:]]◆[[:space:]]◆sqrt[[:space:]]*\([[:space:]]*.*[[:alpha:]]◆.*[[:space:]]*\)'

考虑了以上几种情形,包括制表符,都符合条件,你看还有什么情形遗漏,可以自行补充一下,共匹配10个结果

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

一些补充:脚本是ruby,领会精神就行了......

/regexp/m 多行模式正则表达式

/regexp/ 单行模式正则表达式

=~ 若匹配返回第一个匹配的位置,不匹配则返回nil

string[start...end] 截取字符串从start到end-1的那段dup 复制sub,gsub,sub!,gsub! 字符串替换,感叹号表示替换自身,没感叹号则返回新串正则表达式语法全世界都大同小异,就不解释了......

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章