缘起于网易下属某公司笔试的一道题目,用c/c++实现一个对[8-9][0-9]{3}的正则表达式实现引擎。
这道题目我做错了,因为下意识地认为是"^[8-9[0-9]]{3}$"的表达式。
回头想想,如果不用正则表达式的库,可以:
// trying to match [8-9][0-9]{3}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char input[30];
int i, isvalid;
while( fgets(input,20,stdin) != NULL ){
if(strlen(input) <2) break;
isvalid = 0;
for(i=0;i<strlen(input)-1;i++){
if( input[i] == '8' || input[i] == '9'){
if( input[i+1] >= '0' && input[i+1]<='9' ){
if( input[i+1] == input[i+2] && input[i+2] == input[i+3]){
isvalid = 1;
break;
}
}
}
}
isvalid?printf("Yes\n"):printf("No\n");
}
system("pause");
}
在C/C++中常用的正则表达式库有GNU Regex Library, Boost.Regex, PCRE, PCRE++等等。
以GNU Regex Library为例,
#include <sys /types.h>
#include <regex .h>
#include <stdio .h>
int main(int argc, char ** argv)
{
if (argc != 3)
{
printf("Usage: %s RegexString Text\n", argv[0]);
return 1;
}
const char * pRegexStr = argv[1];
const char * pText = argv[2];
regex_t oRegex;
int nErrCode = 0;
char szErrMsg[1024] = {0};
size_t unErrMsgLen = 0;
if ((nErrCode = regcomp(&oRegex, pRegexStr, 0)) == 0)
{
if ((nErrCode = regexec(&oRegex, pText, 0, NULL, 0)) == 0)
{
printf("%s matches %s\n", pText, pRegexStr);
regfree(&oRegex);
return 0;
}
}
unErrMsgLen = regerror(nErrCode, &oRegex, szErrMsg, sizeof(szErrMsg));
unErrMsgLen = unErrMsgLen < sizeof(szErrMsg) ? unErrMsgLen : sizeof(szErrMsg) - 1;
szErrMsg[unErrMsgLen] = '\0';
printf("ErrMsg: %s\n", szErrMsg);
regfree(&oRegex);
return 1;
}