正規表示式匹配

2021-10-08 07:47:50 字數 1387 閱讀 1755

請實現乙個函式用來匹配包含』. 『和』『的正規表示式。模式中的字元』.『表示任意乙個字元,而』'表示它前面的字元可以出現任意次(含0次)。匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"abaca"匹配,但與"aa.a"和"ab*a"均不匹配。

設正規表示式為p,主串為s,s前面i-1個字元和p前面j-1個字元已經匹配

1.遞迴法

1)若p[j]不為』∗』,p[j+1]不為』∗』 ,則比較s[i]與p[j],若s[i]==p[j]或者p[j]為』.』,將主串和模式串均像後移動一位(i+=1,j+=1),繼續比較,不相等則返回false

2)若p[j]不為』∗』,p[j+1]為』∗』,則分兩種情況

1.p[j]出現一次,若s[i]==p[j],則將主串往後移動一位(i+=1),模式串不移動,繼續比較,若不等則表示不匹配

2.p[j]不出現,將模式串後移兩位(j+=2),繼續比較

bool

mach

(string s,string p,

int i,

int j)

//表示s[0..i-1]與p[0..j-1]已經匹配

return1;

}else

else

}return0;

}

2.動態規劃

設f[i][j]表示模式串s的前i個字元和正則串的前j個字元能否匹配

1.情況一:若p[j]為普通字元,則看s[i]==p[j],若相等則看s[0…i-1]與p[0…j-1],不等則表示不匹配

情況二:若p[j]為』.』,則看s[0…i-1]與p[0…j-1]能否匹配

兩種情況可合為一種

f[i][j]=f[i-1][j-1]

2.若p[j]為』*』,則分為匹配一次和匹配0次

匹配一次:若p[j-1]能和s[i-1]匹配,(即p[j-1]=s[i-1]或者p[j- 1]=』.』),則能否匹配取決於s[0…i-1]和p[0…j]是否匹配

f[i][j]=f[i-1][j]

匹配0次:能否匹配取決於s[0…i]和p[j-2]能否匹配

f[i][j]=f[i][j-2]

bool

ismatch

(string s, string p)

else

//匹配一次

if(i>=

1&&j>=2&&

(p[j-2]

=='.'

||s[i-1]

==p[j-2]

))f[i]

[j]=

(f[i]

[j]||f[i-1]

[j]);}

}}}return f[m]

[n];

}

正規表示式 匹配

字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 class solutio...