正则表达式匹配器

正则表达式是描述文本的表示法,它可以有效地构造一种模式匹配夫人专用语言,他们虽有许多不同的形式,但他们有着共同的思想:模式中的大多数字符都是匹配字符串中的字符本身。但有些元字符有特殊的含义,比如 * 表示某种重复,[...]表示方括号中字符集合的任何一个字符,*.c 表示以 .c结尾的文件。

以下的代码实现了一个正则表达式,用来处理下面的模型:

 

字符 含义
c 匹配任意的字母c
.(句点) 匹配任意的单个字符
^ 匹配输入字符串的开头
$ 匹配输入字符串的结尾
* 匹配前一个字符的零个或者多个出现

 

 

 

 

 

如下程序将读取标准输入或者一组文件,然后输出包含与正则表达式匹配的文件

 

  1. /* match: search for regexp anywhere in text */ 
  2. int match(char *regexp,char *text) 
  3.     if(regexp[0] == '^'
  4.     return matchhere(regexp+1,text); 
  5.     do{  /* must look even if string is empty */ 
  6.     if(matchhere(regexp,text)) 
  7.          return 1; 
  8.     }while(*text++ != '\0');//当未到达文件尾部时 
  9.     return 0; 
  10.  
  11. /* matchhere :search for regexp at beginning of text */ 
  12. int matchhere(char *regexp,char *text) 
  13.     if(regexp[0] == '\0'
  14.     return 1; 
  15.     if(regexp[1] == '*'
  16.     return matchhere(regexp[0],regexp+2,text); 
  17.  
  18.     if(regexp[0] == '$' && regexp[1] == '\0'
  19.     return *text == '\0'
  20.     if(*text != '\0' && (regexp[0] == '.' || regexp[0] == *text)) 
  21.     return matchhere(regexp+1,text+1); 
  22.     return 0; 
  23.  
  24. /* matchstar:search for c*regexp at beginning of text */ 
  25. int matchstar(int c,char *regexp,char *text) 
  26.    do{  /* a *matches zero or more instaances */ 
  27.     if(matchhere(regexp,text)) 
  28.         return 1; 
  29.    }while(*text != '\0' && (*text++ == c || c == '.')); 
  30.    return 0;