검은 질문 19- 정규 표현 일치를 제공함을 나타냅니다.

정규식 일치

제목 : '.'및 '*'를 포함하는 정규식과 일치하는 함수를 구현하십시오. 패턴의 문자 '.'는 임의의 문자를 의미하고, '*'는 앞의 문자가 여러 번 (0 회 포함) 나타날 수 있음을 의미합니다. 이 질문에서 일치는 문자열의 모든 문자가 전체 패턴과 일치 함을 의미합니다. 예를 들어 문자열 "aaa"는 패턴 "aa"및 "ab * ac * a"와 일치하지만 "aa.a"및 "ab *와 일치합니다. a ""일치하지 않음

패턴의 문자와 일치하도록 문자열에서 문자를 가져올 때마다.

문자열 a가 일치하는 문자열이고 문자열 b가 패턴이라고 가정합니다.

일치하는 방법

1. 패턴 b의 문자 ch가 '.'이면 문자열의 모든 문자와 일치 할 수 있습니다.
2. 패턴 b의 문자 ch가 '.'가 아니고 문자열 a의 문자도 ch이면, 그런 다음 서로 일치합니다. 이때 다음 문자를 일치시켜야합니다.
3. 다음 문자가 '*'가 아닌
경우 문자열 a의 첫 번째 문자가 패턴 b의 첫 번째 문자와 일치하면 둘 다 이동됩니다. 뒤로, 그렇지 않으면 거짓
4를 반환 합니다. 다음 문자가 '*'이면
일치하는 메서드가 여러 개있을 수 있습니다.
첫 번째 방법 은 패턴 b가 두 문자 뒤로 이동하고 문자열 a는 이동하지 않으므로 0 문자와 일치합니다. .
두 번째는 두 개의 문자 뒤로 이동하는 이동 b를 한 문자 모드 위로 문자열 또는 변하지

예-일러스트레이션

다음과 같이 패턴 ba * ab를 예제로 사용하여 비 결정적 우선 순위 상태 머신 다이어그램을 그릴 수 있습니다.
여기에 사진 설명 삽입
일치가 상태 2에 들어가고 문자열 a의 문자가 'a'이면 두 가지 선택이 있습니다.
1. Enter 상태 3. (모드에서 두 문자 뒤로 이동)
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