我可以使用regex_t进行多次编译

时间:2009-09-22 12:02:26

标签: c regex

基本问题,对于regcomp人来说,我不清楚。

如果我有一个regex_t的静态实例,我可以重复使用它进行多次编译而不必每次都释放它,例如:

    int match(char* pattern, char* name) {
       static regex_t re;
       regcomp(&re,pattern,REG_EXTENDED|REG_NOSUB);
      ...
    }

代码本身有点复杂,如果在调用之间没有更改模式,那么想法是使用静态变量来保存编译。问题是我是否需要在每个新的regcomp之前调用regfree。

感谢。

2 个答案:

答案 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”消息。