#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");
引用 头文件 #include math.h
单看这个正则的意思是:
匹配以若干个(包括0个)空格或制表符开头,后跟一串不以"/"开头的字符.
显然这和你的要求不符.因为[^/]也可以匹配空白字符.比如:
空格//注释
你的本意是[:blank:]*匹配空格,[^/]不匹配"/"所以该行应该不匹配.
但是,实际的匹配过程没有在此打住:
正则回溯,这一次尝试[:blank:]*神马都不匹配,[^/]匹配空格,.*匹配剩余字符,于是这一行就被匹配了.
稍微改动就可以解决这个问题,^[:blank:]*[^\s/].*$其中\s匹配所有不可见字符,或许你也可以写成^[:blank:]*[^[:blank:]/].*$这种形式,再或者也可以写成只匹配注释的正则,再从不匹配的里面区分代码和空行.
函数定义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个结果
一些补充:脚本是ruby,领会精神就行了......
/regexp/m 多行模式正则表达式
/regexp/ 单行模式正则表达式
=~ 若匹配返回第一个匹配的位置,不匹配则返回nil
string[start...end] 截取字符串从start到end-1的那段dup 复制sub,gsub,sub!,gsub! 字符串替换,感叹号表示替换自身,没感叹号则返回新串正则表达式语法全世界都大同小异,就不解释了......