user-0 提问: C语言编程挑战贴，重金悬赏100，纯C的正则表达式实现！！！！！

回复:
user: user-0
content: 先写个死的吧，有时间再改成活的  long CAPIConvert::__Type(TCHAR* szBuf, long nBufSizeInCharacter, long &nCurIndex) { 	// 	if (nCurIndex>nBufSizeInCharacter) 	{ 		return -1; 	} 	else 	{ 		TCHAR N = szBuf[nCurIndex]; 		if (N==' ' || N=='\t') 		{ 			return eSPACE; 		} 		else if (N=='+' || N=='-') 		{ 			return eSIGN; 		} 		else if (N>=0x30 && N<=0x39) 		{ 			return eNUM; 		} 		else if (N=='.') 		{ 			return ePOINT; 		} 		else if (N=='D' || N=='d' || N=='E' || N=='e') 		{ 			return eFLAG; 		} 		else 		{ 			return -2; 		} 	} }  long CAPIConvert::__Skip(TCHAR* szBuf, long nBufSizeInCharacter, long &nCurIndex, long nTypeToSkip, long SkipCount) {	 	//返回0表示完全满足要求，返回负数表示不满足要求，返回正数表示其情况 	if (SkipCount<=-1)	 	{	 		//任意多个 		do  		{ 			if (nTypeToSkip!=__Type(szBuf,nBufSizeInCharacter,nCurIndex)) 			{ 				return 0;//表示遇到不同类型了 			} 			else 			{ 				nCurIndex++; 			} 		} while (nCurIndex<=nBufSizeInCharacter);  		return 1;//表示移动到结尾了也没有遇到不同类型 	} 	else 	{	 		//有限个 		long n = 0; 		do  		{ 			if (n<SkipCount) 			{	 				if (nTypeToSkip==__Type(szBuf,nBufSizeInCharacter,nCurIndex)) 				{ 					n++; 					nCurIndex++; 				} 				else 				{ 					return -1;	//不满足要求，未达到指定个数就遇到不同类型了 				} 			} 			else 			{ 				return 0;		//满足要求了，达到指定个数了，且在这期间未遇到不同类型 			} 		} while (nCurIndex<=nBufSizeInCharacter);  		return -2;				//不满足要求，未达到指定个数，就到结尾了，虽然在这期间未出现不类型 	} }  long CAPIConvert::_StringFormatCheckForInt(TCHAR *szBuf, long nBufSizeInCharacter) {	 	long nRet=0, nSkipCount=0, nIndex=0, nType=0;  	nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 	if (nType==eSPACE) 	{	 		nRet = __Skip(szBuf,nBufSizeInCharacter,nIndex,nType,-1); 		if (nRet==0) 		{	 			nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 			if (nType==eSIGN) 			{	 				nRet = __Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1); 				if (nRet==0) 				{ 					nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 					if (nType==eNUM) 					{ 						return 0; 					} 				} 			} 			else if (nType==eNUM) 			{ 				return 0; 			} 		} 	} 	else if (nType==eSIGN) 	{ 		nRet = __Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1); 		if (nRet==0) 		{ 			nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 			if (nType==eNUM) 			{ 				return 0;		 			} 		} 	} 	else if (nType==eNUM) 	{ 		return 0; 	}  	return -1; }  long CAPIConvert::_StringFormatCheckForDouble(TCHAR *szBuf, long nBufSizeInCharacter) { 	//枚举完所有的类型格式即可 	//[whitespace] [sign] [digits] [.digits] [ {d | D | e | E }[sign]digits]  	long nRet=0, nSkipCount=0, nIndex=0, nType=0; 	nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 	if (nType==eSPACE) 	{	 		if (__Skip(szBuf,nBufSizeInCharacter,nIndex,nType,-1)==0) 		{ 			nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 			if (nType==eSIGN) 			{ 				if (__Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1)==0) 				{ 					nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 					if (nType==ePOINT) 					{ 						if (__Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1)==0) 						{ 							nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 							if (nType==eNUM) 							{ 								return 0; 							} 						} 					} 					else if (nType==eNUM) 					{ 						return 0; 					} 				} 			} 			else if (nType==ePOINT) 			{ 				if (__Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1)==0) 				{ 					nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 					if (nType==eNUM) 					{ 						return 0; 					} 				} 			} 			else if (nType==eNUM) 			{ 				return 0; 			} 		} 	} 	else if (nType==eSIGN) 	{ 		if (__Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1)==0) 		{ 			nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 			if (nType==ePOINT) 			{ 				if (__Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1)==0) 				{ 					nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 					if (nType==eNUM) 					{ 						return 0; 					} 				} 			} 			else if (nType==eNUM) 			{ 				return 0; 			} 		} 	} 	else if (nType==ePOINT) 	{	 		if (__Skip(szBuf,nBufSizeInCharacter,nIndex,nType,1)==0) 		{ 			nType = __Type(szBuf,nBufSizeInCharacter,nIndex); 			if (nType==eNUM) 			{ 				return 0; 			} 		} 	} 	else if (nType==eNUM) 	{ 		return 0; 	}  	return -1; }  long CAPIConvert::StringToInt(TCHAR *szBuf, long nBufSizeInCharacter, int &RtnValue) {	 	if (_StringFormatCheckForInt(szBuf,nBufSizeInCharacter)==0) 	{ 		RtnValue = _tstoi(szBuf); 		return 0; 	} 	else 	{ 		return -1; 	} }  long CAPIConvert::StringToDouble(TCHAR *szBuf, long nBufSizeInCharacter, double &RtnValue) {	 	if (_StringFormatCheckForDouble(szBuf,nBufSizeInCharacter)==0) 	{ 		RtnValue = _tstof(szBuf); 		return 0; 	} 	else 	{ 		return -1; 	} }

user: user-1
content: 引用 7 楼 user-7 的回复:简单的递归降价就可以写得非常漂亮了，没必要上大杀器吧。 [quote=引用 6 楼 mLee79 的回复:] 这种简单玩意有啥好写的. 像这样可以不...   [/quote]  请问大杀器是什么？

user: user-2
content: 引用 5 楼 zhao4zhong1 的回复:或者随便参考下面哪个都行： C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\INPUT.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\input.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\input.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c 正解！

user: user-3
content: 楼主能给我讲解一下atoi函数吗？字符串转换的机理是什么呀？

user: user-4
content: 引用 10 楼 sinservice 的回复:[quote=引用 6 楼 mLee79 的回复:] 这种简单玩意有啥好写的. 像这样可以不...      这个没有达成目标，这个只能匹配固定的正则吧。[/quote]  他这就只要匹配这两个正则啊,  用代码生成 DFA 表也容易,  我就写了个自己用, 这也贴不上来啊. 用 C 就不要用忽悠人的 NFA 的引擎了.

user: user-4
content: 引用 7 楼 user-7 的回复:简单的递归降价就可以写得非常漂亮了，没必要上大杀器吧。 [quote=引用 6 楼 mLee79 的回复:] 这种简单玩意有啥好写的. 像这样可以不...   [/quote]  还是这样简单些, 好自动生成代码, 我就用DFA + LALR , 都好自动化, 很久没手工 LL 了..

user: user-5
content: 引用 6 楼 mLee79 的回复:这种简单玩意有啥好写的. 像这样可以不...  #include <stdio.h>  int yylex(unsigned char** in_out_text) {	 	static const int yy_accept[18] = 	{   0, 		0,    0,    4,    3,    3,    3,    3,    1,    0,    0, 		0,    1,    2,    0,    0,    2,    0 	} ; 	 	static const int yy_ec[256] = 	{   0, 		1,    1,    1,    1,    1,    1,    1,    1,    2,    2, 		2,    2,    2,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    2,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    3,    1,    3,    4,    1,    5,    5,    5, 		5,    5,    5,    5,    5,    5,    5,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    6,    6,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    6, 		 		6,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1 	} ; 	 	static const int yy_meta[7] = 	{   0, 		1,    1,    1,    1,    2,    1 	} ; 	 	static const int yy_base[20] = 	{   0, 		0,    0,   19,   20,    5,    7,    0,   12,    0,    0, 		0,    0,   11,   10,    0,    0,   20,   14,   12 	} ; 	 	static const int yy_def[20] = 	{   0, 		17,    1,   17,   17,   17,   17,   18,    6,    5,    6, 		18,    8,   18,   17,   19,   19,    0,   17,   17 	} ; 	 	static const int yy_nxt[27] = 	{   0, 		4,    5,    6,    7,    8,    4,    9,   10,   11,   12, 		11,   12,   15,   16,   16,   13,   14,   14,   17,    3, 		17,   17,   17,   17,   17,   17 	} ; 	 	static const int yy_chk[27] = 	{   0, 		1,    1,    1,    1,    1,    1,    5,    5,    5,    5, 		6,    6,   14,   19,   14,   18,   13,    8,    3,   17, 		17,   17,   17,   17,   17,   17 	}; 	 	unsigned char *text = *in_out_text, *text_back = NULL; 	int curr = 1, backup, c;  	if(!*text) 		return 0;  	do { 		if(!*text) 			break; 		 		if(*text < 0 || *text >= 256) 			c = 1; 		else 			c = yy_ec[*text]; 		 		if(yy_accept[curr]) 		{ 			backup	   = curr; 			text_back  = text; 		} 		 		while(yy_chk[yy_base[curr] + c] != curr) 		{ 			curr = yy_def[curr]; 			if(curr >= sizeof(yy_accept) / sizeof(yy_accept[0])) 				c = yy_meta[c]; 		} 		curr = yy_nxt[yy_base[curr] + c]; 		++text; 	} while(yy_base[curr] != yy_base[sizeof(yy_accept) / sizeof(yy_accept[0]) - 1]); 	 	if(0 == yy_accept[curr]) 	{ 		curr = backup; 		text = text_back; 	} 	 	*in_out_text = text; 	return yy_accept[curr]; }  int is_number(const char* input) { 	unsigned char* p = (unsigned char*)input; 	int r = yylex(&p);  	return (0 == *p || '\r' == *p || '\n' == *p) && 1 == r; }  int is_float(const char* input) { 	unsigned char* p = (unsigned char*)input; 	int r = yylex(&p); 	 	return (0 == *p || '\r' == *p || '\n' == *p) && (1 == r || 2 == r); }  int main() { 	char line[1024+1] = {0}; 	while(NULL != fgets(line, 1024, stdin)) 	{ 		printf("%d %d\n", is_number(line), is_float(line)); 	}  	return 0; }     这个没有达成目标，这个只能匹配固定的正则吧。

user: user-5
content: N年前就写完了，只是在库内，怎么给你代码？

user: user-6
content: 重金悬赏100 连赵老师都跪了，估计别人也不行  这人也是挺中二的。

user: user-7
content: 简单的递归降价就可以写得非常漂亮了，没必要上大杀器吧。 引用 6 楼 mLee79 的回复:这种简单玩意有啥好写的. 像这样可以不...

user: user-4
content: 这种简单玩意有啥好写的. 像这样可以不...  #include <stdio.h>  int yylex(unsigned char** in_out_text) {	 	static const int yy_accept[18] = 	{   0, 		0,    0,    4,    3,    3,    3,    3,    1,    0,    0, 		0,    1,    2,    0,    0,    2,    0 	} ; 	 	static const int yy_ec[256] = 	{   0, 		1,    1,    1,    1,    1,    1,    1,    1,    2,    2, 		2,    2,    2,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    2,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    3,    1,    3,    4,    1,    5,    5,    5, 		5,    5,    5,    5,    5,    5,    5,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    6,    6,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    6, 		 		6,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1,    1,    1,    1,    1,    1, 		1,    1,    1,    1,    1 	} ; 	 	static const int yy_meta[7] = 	{   0, 		1,    1,    1,    1,    2,    1 	} ; 	 	static const int yy_base[20] = 	{   0, 		0,    0,   19,   20,    5,    7,    0,   12,    0,    0, 		0,    0,   11,   10,    0,    0,   20,   14,   12 	} ; 	 	static const int yy_def[20] = 	{   0, 		17,    1,   17,   17,   17,   17,   18,    6,    5,    6, 		18,    8,   18,   17,   19,   19,    0,   17,   17 	} ; 	 	static const int yy_nxt[27] = 	{   0, 		4,    5,    6,    7,    8,    4,    9,   10,   11,   12, 		11,   12,   15,   16,   16,   13,   14,   14,   17,    3, 		17,   17,   17,   17,   17,   17 	} ; 	 	static const int yy_chk[27] = 	{   0, 		1,    1,    1,    1,    1,    1,    5,    5,    5,    5, 		6,    6,   14,   19,   14,   18,   13,    8,    3,   17, 		17,   17,   17,   17,   17,   17 	}; 	 	unsigned char *text = *in_out_text, *text_back = NULL; 	int curr = 1, backup, c;  	if(!*text) 		return 0;  	do { 		if(!*text) 			break; 		 		if(*text < 0 || *text >= 256) 			c = 1; 		else 			c = yy_ec[*text]; 		 		if(yy_accept[curr]) 		{ 			backup	   = curr; 			text_back  = text; 		} 		 		while(yy_chk[yy_base[curr] + c] != curr) 		{ 			curr = yy_def[curr]; 			if(curr >= sizeof(yy_accept) / sizeof(yy_accept[0])) 				c = yy_meta[c]; 		} 		curr = yy_nxt[yy_base[curr] + c]; 		++text; 	} while(yy_base[curr] != yy_base[sizeof(yy_accept) / sizeof(yy_accept[0]) - 1]); 	 	if(0 == yy_accept[curr]) 	{ 		curr = backup; 		text = text_back; 	} 	 	*in_out_text = text; 	return yy_accept[curr]; }  int is_number(const char* input) { 	unsigned char* p = (unsigned char*)input; 	int r = yylex(&p);  	return (0 == *p || '\r' == *p || '\n' == *p) && 1 == r; }  int is_float(const char* input) { 	unsigned char* p = (unsigned char*)input; 	int r = yylex(&p); 	 	return (0 == *p || '\r' == *p || '\n' == *p) && (1 == r || 2 == r); }  int main() { 	char line[1024+1] = {0}; 	while(NULL != fgets(line, 1024, stdin)) 	{ 		printf("%d %d\n", is_number(line), is_float(line)); 	}  	return 0; }

user: user-2
content: 或者随便参考下面哪个都行： C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\INPUT.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\input.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\input.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c

user: user-0
content: 等我写一个吧，这个论坛太垃圾，连赵老师都跪了，估计别人也不行

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:参考《编译原理》中的词法分析和有限状态自动机。 我觉得只是对那些不懂的人难，其实也没啥

user: user-2
content: 参考《编译原理》中的词法分析和有限状态自动机。

user: user-0
content: 更正一点，是验证那上面两种串格式，不是解析