我希望将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
答案 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"]