面試題 正規表示式的匹配

2021-08-20 00:03:31 字數 2069 閱讀 2955

今天看到這樣乙個題,實現字串的模式匹配,具體題目如下:

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

經過簡單的分析,我們可以很容易想到利用遞迴求解,先匹配字串中的當前字元,如果匹配成功,則遞迴匹配下乙個字元,否則返回 false。下面看看字串匹配的具體過程:

為了方便說明,str 表示字串,pattern 表示模式串

bool match_core (char *str, char *pattern);

1、首先考慮遞迴出口:

*str == '\0' && *pattern == '\0'

,即 str 和 pattern 都是空串時,我們說它們是匹配的,返回 true;

*str != '\0' && *pattern == '\0',str 無法完成匹配,返回 false.

【注意】當 *str =='\0' && *pattern != '\0' 時,是有可能匹配成功的,比如:pattern 為 a*,而 str 為空串時,是可以匹配成功的。因為 『*』 前面的字元 a 可以出現0次。

2、我們可以將匹配過程分為兩類:一類是*(pattern + 1) != '*';另一類是*(pattern + 1) == '*',下面基於這兩種情況討論該問題的具體實現:

當*(pattern + 1) != '*' 

時,只要 *str 與 *pattern 匹配,兩個字串分別向前移動一步。即:

若  *str == *pattern, 則 match_core (str + 1, pattern + 1);

若   *str != '\0' && *pattern == '.',則 match_core (str + 1, pattern + 1);

若 *str 和 *pattern 不滿足上述兩個條件,說明 *str 和 *pattern 不匹配,直接返回 false。

當 *(pattern + 1) == '*' 時,根據 *pattern 與 *str 匹配的個數,可以分為下面幾種情況:

若匹配個數為0,即 *pattern 與 *str 不匹配,則match_core (str, patten + 2);

若匹配個數為 1 個或多個,我們只需要每次將 str 向前移一步,pattern 保持原來的位置,繼續做下一輪匹配,即match_core (str + 1, pattern)。

我們考慮這種情況:str = "aaaaa", pattern = "aa*a",按照題目敘述的匹配原則,str 與 pattern 應該是匹配的,但是按照我們剛才分析的思路走下來,match_core返回的是false,分析明顯是由漏洞的,我們再來看看*(pattern + 1) == '*'中匹配個數是多個的情況,我們不僅要考慮 str + 1 與 pattern 的匹配, 還要考慮到 str 與 pattern + 2 的匹配情況,只要這兩種情況中的任何一種匹配成功, str 和 pattern 都算是匹配成功。

基於上述分析,給出 c++ **如下:

//正規表示式匹配核心部分

bool match_core (char *str, char *pattern)

if (*str != '\0' && *pattern == '\0')

//下面來分析pattern沒有走完的情況

if (*(pattern + 1) != '*')

else

}else

else

}}bool match (char *str, char *pattern)

if (str == null || pattern == null)

return match_core (str, pattern);

}

面試題53 正規表示式匹配

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

面試題53 正規表示式匹配

當模式中的第二個字元不是 時 1 如果字串第乙個字元和模式中的第乙個字元相匹配,那麼字串和模式都後移乙個字元,然後匹配剩餘的。2 如果 字串第乙個字元和模式中的第乙個字元相不匹配,直接返回false。而當模式中的第二個字元是 時 如果字串第乙個字元跟模式第乙個字元不匹配,則模式後移2個字元,繼續匹配...

面試題19正規表示式匹配

題目 實現乙個函式用來匹配包含 和 的正規表示式,可以代表任意字母,表示他前面的字元可以出現 0次,includeusing namespace std bool matchcore char str,char pattern if str 0 pattern 0 if str 0 pattern ...