正規表現マッチング
件名:「。」と「*」を含む正規表現に一致する関数を実装してください。パターン内の文字「。」は任意の文字を意味し、「*」はその前の文字が任意の回数(0回を含む)出現できることを意味します。この質問では、一致とは、文字列内のすべての文字がパターン全体に一致することを意味します。たとえば、文字列「aaa」はパターン「aa」と「ab * ac * a」に一致しますが、「aa.a」と「ab * a ""一致しない
パターン内の文字と一致するように文字列から文字が取得されるたび。
文字列aが一致する文字列であり、文字列bがパターンであるとします。
一致させる方法
1.パターンbの文字chが「。」の
場合、文字列内の任意の文字と一致します。2。パターンbの文字chが「。」ではなく、文字列aの文字もchである場合、次に、それらは互いに一致します
。このとき、次の文字を一致させる必要があります。3 。次の文字が「*」で
ない場合、文字列aの最初の文字がパターンbの最初の文字と一致すると、両方が移動します。後方、それ以外の場合はfalseを返します
。4。次の文字が「*」の
場合、複数の一致メソッドが存在する可能性があります。
最初の方法では、パターンbが2文字戻り、文字列aは移動しません。つまり、0文字に一致します。
2番目の文字列は、aが1文字戻る、モードbが2文字戻る、または変更されない文字列です。
例-イラスト
次のように、パターンba * abを例として使用して、非決定論的優先状態マシン図を描画できます。
一致が状態2に入り、文字列aの文字が「a」の場合、2つの選択肢があり
ます。1。入力状態3.(モードを2文字戻します)
2。状態3に戻ります(モードは変更されません)
コード
コードは次のように表示されます。
bool match(char* str,char* pattern)
{
if(str==nullptr || pattern==nullptr)
return false;
return matchCore(str,pattern);
}
bool matchCore(char* str,char* pattern)
{
if(*str=='\0' && *pattern=='\0')
return true;
if(*str!='\0' && *pattern=='\0')
return false;
if(*(pattern+1)=='*')
{
if(*pattern==*str || (*pattern=='.' && *str!='\0'))
//移动到下一个状态
return matchCore(str+1,pattern+2)
//停留在当前状态
|| matchCore(str+1,pattern)
//忽略一个 '*'
|| macthCore(str,pattern+2);
else
return matchCore(str,pattern+2);
}
if(*str==*patter || (*pattern=='.' && *str!='\0'))
return matchCore(str+1,pattern+1);
return false;
}