论坛: 编程破解 标题: 转帖用C与正则表达式 复制本贴地址    
作者: TomyChen [quest]    版主   登录
代码:

/* regex_test.c 
* regular expression test in GNU C 

* tested on redhat6.1 
* gcc regex_test.c -o regex_test 
*/ 

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <regex.h> 

#define SUBSLEN     10 
#define EBUFLEN     128  /* error buffer length */ 
#define BUFLEN     1024  /* matched buffer length */ 

int 
main (int argc, char **argv) 

  FILE *fp; 
  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[] = "AAAAabaaababAbAbCdCd123123 11(123){12}"; 
  char pattern[] = "(\\([0-9]+\\))(\\{[0-9]+\\}{1})$"; 

  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); 
    exit (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); 
    exit (0); 
  } 
  else if (err) 
  { 
    len = regerror (err, &re, errbuf, sizeof (errbuf)); 
    fprintf (stderr, "error: regexec: %s\n", errbuf); 
    exit (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); 
  exit(0); 
}



地主 发表时间: 07/11 15:48

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号