正規表示式匹配

2021-09-02 13:30:31 字數 1673 閱讀 3223

請實現乙個函式用來匹配包含".

.." 和的"∗

*∗" 的正規表示式。模式中的字元".

.."表示任意乙個字元,而 "∗

*∗"表示它前面的字元可以出現任意次(含0次)。在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"abaca"匹配,但與"aa.a"及"ab*a"均不匹配。

每次從字串裡拿出乙個字元和模式串去匹配,那麼如何去匹配乙個字元?

如果模式中的字元ch不是".

..",而字串中的字元也是ch,那麼它們互相匹配。如果模式串中的字元ch是".

.."時,那麼可以匹配字串中的任意乙個字元。當字串中的字元和模式串中的字元相匹配的時候,繼續匹配後面的字元。

當模式中的第二個字元是"∗

*∗「時,情況就比較複雜。這種情況下,有三種可能的匹配情況:

1.模式向後移動兩個字元,這種情況相當於」∗

*∗「和它前面的字元被忽略掉了,因為」∗

*∗"可以匹配字串中的0個字元。

2.如果字串和模式串的第乙個字元相匹配,那麼字串向後移動乙個字元。模式串可以分為兩種情況:向後移動兩個字元,或者保持不變。

如下圖所示ba*ab的模式串。當匹配進入狀態2,並且字串的字元是a時,有兩種選擇:進入狀態3(在模式上向後移動兩個字元),也可以回到狀態2(模式保持不變)。

當字串和模式串都匹配到字串結束,那麼匹配成功。

當模式串匹配結束,但是字串沒有匹配完,那麼匹配失敗。

#include

#include

using

namespace std;

bool

matchcore

(const

char

* str,

const

char

* pattern)

;bool

match

(const

char

* str,

const

char

* pattern)

bool

matchcore

(const

char

* str,

const

char

* pattern)

elseif(

*str ==

*pattern ||

(*pattern ==

'.'&&

*str !=

'\0'))

return

false;}

// ********************測試**********************

void

test

(const

char

* testname,

const

char

* string,

const

char

* pattern,

bool expected)

intmain

(int argc,

char

* argv)

正規表示式 匹配

字串 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...