LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 554|回复: 1

关于正则表达式

[复制链接]
发表于 2006-11-7 11:00:08 | 显示全部楼层 |阅读模式
搜索relative path的正则表达式用regcomp编译报错:Invalid preceding regular expression;估计是(?!http|/|\"http|\"/)这部分正则表达式导致的;但是我把这些正则表达式移植到java下就没有问题;问一下是不是不支持还是其他原因?请问如何解决这个问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>

//for searching relative path
#define SRC_RELATIVE "src\\s*=\\s*\"?(?!http|/|\"http|\"/)\\S+\\.%s\"?"

//for test
char *s= " src=aaa.gif src=\"aaa.gif\" \
                 Src = /aaa/aaa.gif src = \"/aaa/aaa.gif\" \
                 src = http://www.site.com/aaa.gif src = \"http://www.site.com/aaa.gif\" ";


char *get_regerror (int errcode, regex_t *compiled){
        size_t length = regerror (errcode, compiled, NULL, 0);
        char *buffer = malloc(length);
        regerror (errcode, compiled, buffer, length);
        return buffer;
}
         
void doit(char *src,char *reg,char *restype){
        char line[100];
        char *c = src;
        char result[100];
        regex_t r;
        regmatch_t match;
        int i;
       
        bzero(line,sizeof(line));
        snprintf(line,sizeof(line),reg,restype);
       
        if((i = regcomp(&r,line,REG_EXTENDED | REG_ICASE)) != 0){
                fprintf(stderr,"%s\n",get_regerror(i,&r));
                exit(1);
        }
        while((i = regexec(&r,c,1,&match,0)) == 0) {
                bzero(result,sizeof(result));
                int eo = (int)match.rm_eo;
                int so = (int)match.rm_so;
                memcpy(result,c + so,eo - so);
                printf("%s\n",result);
                c += match.rm_eo;//for another match
        }
        regfree(&r);
}

int main(){
        printf("relative path:\n");
        doit(s,SRC_RELATIVE,"gif");
               
        return 0;
}
发表于 2006-11-12 09:37:42 | 显示全部楼层
regcomp 是嘛东西?
你可以查查他的手册,看看写的re是不是符合他的规则
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表