用C語(yǔ)言完成一個(gè)正則表達式的匹配: 字符串中只有*和?是可變字符且位置和個(gè)數不固定,其他的字符位置固定
??#include
#include
#include
//1、'?'很好處理,只要在原有的定位函數中加一點(diǎn)點(diǎn)就行:
int index(char *s,char *t,int pos)
int i=pos,j=0,lens=strlen(s),lent=strlen(t);
while(i {
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;
/*2、'*'的處理有些麻煩,很自然的想法是'*'把整個(gè)T串分成若干不含'*'的子串,
拿這些子串依次匹配S串。
按這樣的方法可以把S串分成兩類(lèi):
A、T=T1*T2*。。。Tn*,其中Ti為不含'*'的子串,且不為空(T1可為空)。
B、T=T1*T2*。。。Tn
二者的差別只在于尾部是否有'*'。
拿T匹配S,
首先 T1匹配S頭部,index(s,t1,0)==0
然后 用循環(huán)完成后面的匹配,從前一次匹配后的末尾位置開(kāi)始向后匹配,
如果匹配成功再把末尾位置記錄下來(lái)。
??這里只用了最左匹配,為什么就足夠了呢?
比如實(shí)際中的情況T1串可能在S串不止出現一次,為什么只考慮最左一個(gè)呢?
因為整個(gè)匹配過(guò)程是從左向右,最左匹配可以保證余下的S子中最長(cháng),更有利于后面T子串的匹配成功,
試想如果T1最左匹配不成功,靠右一些有可能成功嗎?
例:T="*is*a*" S="this is a program"
T 子串"is"在S中有出現兩個(gè)位置,匹配的時(shí)候只需要考慮最左邊那個(gè)"is"就行了,
因為最左邊的"is"匹配成功后,余下的S子串是" is a program",余下的T子串是"*a",
最左匹配可使余下的S子串最長(cháng),匹配的可能最大,最容易匹配的情況已經(jīng)驗證了,
就不用再做無(wú)用功了。
int match(char *s,char *t)
int i=0,j=0,lens=strlen(s),lent=strlen(t);
char buf[128];
int bufp=0;
while(j {
buf[bufp]=t[j];
bufp; j;
buf[bufp]='