C语言中的正则表达式实现

缘起于网易下属某公司笔试的一道题目,用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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值