Извините, я не могу написать хорошее объяснение, но вот пример кода для одноэлементного кэша 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" );
}
Если вы запустите код, вы увидите два сообщения 'regcomp' и четыре сообщения 'regexec' из-за повторного использования regex_t.