剣はオファー質問19を指します-正規表現のマッチング

正規表現マッチング

件名:「。」と「*」を含む正規表現に一致する関数を実装してください。パターン内の文字「。」は任意の文字を意味し、「*」はその前の文字が任意の回数(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;
}

おすすめ

転載: blog.csdn.net/rjszz1314/article/details/104227664
おすすめ