基本问题,对于regcomp人来说,我不清楚。
如果我有一个regex_t的静态实例,我可以重复使用它进行多次编译而不必每次都释放它,例如:
int match(char* pattern, char* name) {
static regex_t re;
regcomp(&re,pattern,REG_EXTENDED|REG_NOSUB);
...
}
代码本身有点复杂,如果在调用之间没有更改模式,那么想法是使用静态变量来保存编译。问题是我是否需要在每个新的regcomp之前调用regfree。
感谢。
答案 0 :(得分:1)
如果您想使用已编译到regcomp()
的{{1}}之前的结果,那就完全没问题 - 只要您不致电re
与此同时。
但是当您想再次调用regfree()
来编译新的正则表达式时,您需要调用regcomp()
来正确释放之前regfree()
调用所使用的所有资源。因此,您可能需要一些其他静态变量来跟踪regcomp()
变量是否已被re
调用,并且在重用之前需要regcomp()
- ed
有些事情:
regfree()
答案 1 :(得分:0)
抱歉,我不能写一个很好的解释,但这是一个单元素regcomp()缓存的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>
static struct {
char *pattern;
regex_t re;
} last_match = { .pattern = (char*)NULL };
int match( const char *pattern, const char *name ){
int ret;
if( last_match.pattern != (char*)NULL && strcmp( last_match.pattern, pattern ) != 0 ){
free( last_match.pattern ); last_match.pattern = (char*)NULL;
regfree( &last_match.re );
}
if( last_match.pattern == (char*)NULL ){
last_match.pattern = (char*)malloc( strlen(pattern)+1 );
strcpy( last_match.pattern, pattern );
ret = regcomp( &last_match.re, last_match.pattern, REG_EXTENDED|REG_NOSUB );
printf("regcomp: %i '%s'\n", ret, last_match.pattern );
}
ret = regexec( &last_match.re, name, 0, (regmatch_t*)NULL, 0);
printf("regexec: %i\n", ret );
return ret;
}
int main(void){
match( "[0-9]+", "qwer1234" );
match( "[0-9]+", "asdf5678" );
match( "[a-z]+", "qwer1234" );
match( "[a-z]+", "asdf5678" );
}
如果您运行代码由于regex_t重用,您将看到两条“regcomp”消息和四条“regexec”消息。