与c中的正则表达式不匹配

时间:2014-08-13 13:18:16

标签: c regex

我希望将C中的正则表达式(?<=SEARCH_THIS=").+(?<!"\n)与PCRE匹配。

但是,以下代码无法按预期工作。

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


int main(void){
    regex_t re;
    regmatch_t matches[2];
    char *regex = "(?<=SEARCH_THIS=\").+(?<!\"\n)";
    char *file = "NO_MATCH=\"0\"\nSOMETHING_ELSE=\"1\"\nSOME_STUFF=\"1\"\nSEARCH_THIS=\"gimme that\"\nNOT_THIS=\"foobar\"\nTHIS_NEITHER=\"test\"\n";

    puts("compiling regex");
    int compErr = regcomp(&re, regex, REG_NOSUB | REG_EXTENDED);
    if(compErr != 0){
        char buffer[128];
        regerror(compErr, &re, buffer, 100);
        printf("regcomp failed: %s\n", buffer);
        return 0;
    }
    puts("executing regex");
    int err = regexec(&re, file, 2, matches, 0);
    if(err == 0){
        puts("no error");
        printf("heres the match: [.%*s]",matches[0].rm_eo-matches[0].rm_so,file+matches[0].rm_so);
    } else {
        puts("some error here!");
        char buffer[128];
        regerror(err, &re, buffer, 100);
        printf("regexec failed: %s\n", buffer);
    }
    return 0;
}

控制台输出是:

compiling regex
executing regex
some error here!
regexec failed: No match

我验证了此正则表达式here的功能 知道这里出了什么问题吗?

编辑#1

编译器版本

 $ arm-merlin-linux-uclibc-gcc --version
 arm-merlin-linux-uclibc-gcc (GCC) 4.2.1
 Copyright (C) 2007 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

编译命令

 $ arm-merlin-linux-uclibc-gcc -lpcre ./re_test.c -o re_test.o

1 个答案:

答案 0 :(得分:1)

您的代码实际上存在一些问题。

首先,您尝试使用%*s来限制打印字符串的长度。但是,s格式化程序之前的整数宽度是打印内容的最小长度;如果相应字符串的长度小于给定的字符串长度,则用空格填充。如果长度更大比给定的长度更大,则只输出整个字符串。您需要一些其他方法来限制输出字符串的长度(只是避免修改*file,因为file指向一个常量字符串。)

其次,您在REG_NOSUB调用中指定了regcomp选项,但是according to the man page,这意味着pmatch参数中没有存储子字符串位置 - 因此,甚至如果您的regexec 工作,则以下printf将使用未初始化的值(这是未定义的行为)。

最后,我怀疑问题是\"\n字符需要双重 - 被释放;即你需要在你的正则表达式字符串中使用\\\"\\n。虽然你给我的代码(Ubuntu 14.04 x64),双重转义版

考虑到所有这些因素,这是我得到的输出:

compiling regex
executing regex
no error
heres the match: [.gimme that"]