#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
    
#define   SUBSLEN   10      
#define   EBUFLEN   128   /*   error   buffer   length   */      
#define   BUFLEN   1024   /*   matched   buffer   length   */      
 
//S > 47 And S < 58 Or S > 64 And S < 91 Or S > 96 And S < 122 Or S = 95 Or S > -20319 And S < -2050 
  int    main   (int   argc,   char   **argv)      
    {          
 size_t   len;   /*   store   error   message   length   */      
 regex_t   re;   /*   store   compilned   regular   expression   */      
 regmatch_t   subs[SUBSLEN];   /*   store   matched   string   position   */      
 char   matched[BUFLEN];   /*   store   matched   strings   */      
 char   errbuf[EBUFLEN];   /*   store   error   message   */      
 int   err,   i;      
  
 char   string[]   =   "_C1__111";      
 char   pattern[]   =   "\^[A-Za-z0-9][A-Za-z0-9_]{5,15}$";      
  
 printf   ("String:%s\n",   string);      
 printf   ("Pattern:\"%s\"\n",   pattern);      
  
 /*   compile   regular   expression   */      
 err   =   regcomp   (&re,   pattern,   REG_EXTENDED);      
  
 if   (err)      
 {      
     len   =   regerror   (err,   &re,   errbuf,   sizeof   (errbuf));      
  fprintf   (stderr,   "error:   regcomp:   %s\n",   errbuf);      
  return 1;      
 }      
  printf   ("Total   has   subexpression:   %d\n",   re.re_nsub);      
  
     /*   execute   pattern   match   */      
  err   =   regexec   (&re,   string,   (size_t)SUBSLEN,   subs,   0);      
  
   if   (err   ==   REG_NOMATCH)      
   {      
    fprintf   (stderr,   "Sorry,   no   match   ...\n");      
    regfree   (&re);      
    return (0);      
   }      
   else   if   (err)      
    {      
    len   =   regerror   (err,   &re,   errbuf,   sizeof   (errbuf));      
    fprintf   (stderr,   "error:   regexec:   %s\n",   errbuf);      
    return   (1);      
    }      
  
     /*   if   no   REG_NOMATCH   and   no   error,   then   pattern   matched   */      
   printf   ("\nOK,   has   matched   ...\n\n");      
   for   (i   =   0;   i   <=   re.re_nsub;   i++)      
   {      
    if   (i   ==   0)      
    {      
        printf   ("begin:   %d,   end:   %d,   ",      
     subs[i].rm_so,   subs[i].rm_eo);      
    }      
    else      
    {      
     printf   ("subexpression   %d   begin:   %d,   end:   %d,   ",      
     i,   subs[i].rm_so,   subs[i].rm_eo);      
    }      
    len   =   subs[i].rm_eo   -   subs[i].rm_so;      
    memcpy (matched,  string + subs[i].rm_so,  len);      
    matched[len]   =   '\0';      
    printf   ("match:   %s\n",   matched);      
    }      
  
   regfree(&re);      
   return(0);      
 }