用C語(yǔ)言完成一個(gè)正則表達式的匹配: 字符串中只有*和?是可變字符且位置和個(gè)數不固定,其他的字符位置固定

4年前 (2020-05-22)閱讀813回復0
活動(dòng)彩頁(yè)
活動(dòng)彩頁(yè)
  • 管理員
  • 發(fā)消息
  • 注冊排名740
  • 經(jīng)驗值80
  • 級別管理員
  • 主題16
  • 回復0
樓主

??#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]='

0
0
收藏0
回帖

用C語(yǔ)言完成一個(gè)正則表達式的匹配: 字符串中只有*和?是可變字符且位置和個(gè)數不固定,其他的字符位置固定 期待您的回復!

取消
載入表情清單……
載入顏色清單……
插入網(wǎng)絡(luò )圖片

取消確定

圖片上傳中
編輯器信息
提示信息