【代码之美】第一章——正则表达式匹配器

【beautiful code】
下面这段代码实现一个正则表达式适配器,用来处理以下的模型:

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











以下是匹配算法的代码:

  1. /* match: 在text中找到regexp */
  2. int match(char *regexp, char *text)
  3. {
  4.     if (regexp[0] == '^')
  5.         return matchhere(regexp + 1, text);
  6.     do { /* 即使字符串为空时也必须检查 */
  7.         if (matchhere(regexp, text))
  8.             return 1;
  9.     } while (*text++ != '/0');
  10.     return 0;
  11. }

  12. /* matchhere: 在text的开头查找regexp */
  13. int matchhere(char *regexp, char *text)
  14. {
  15.     if (regexp[0] == '/0')
  16.         return 1;
  17.     if (regexp[1] == '*')
  18.         return matchstar(regexp[0], regexp + 2, text);
  19.     if (regexp[0] == '$' && regexp[1] == '/0')
  20.         return *text == '/0';
  21.     if (*text != '/0' && (regexp[0] == '.' || regexp[0] == *text))
  22.         return matchhere(regexp + 1, text + 1);
  23.     return 0;
  24. }

  25. /* matchstar: 在text的开头查找C*regexp */
  26. int matchstar(int c, char *regexp, char *text)
  27. {
  28.     do { /* 通配符 * 匹配零个或多个实例 */
  29.         if (matchhere(regexp, text))
  30.             return 1;
  31.     } while (*text != '/0' && (*text++ == c || c == '.'));
  32.     return 0;
  33. }

如果在matchstar函数中需要识别最左边的一级最长的匹配,那么函数将首先识别输入字符c的最大重复序列。然后函数将调用matchhere来尝试把匹配延伸到正则表达式的剩余部分和text的剩余部分。每次匹配失败都会将cs的出现次数减1,然后再次开始尝试,包括处理字符c零出现的情况:

  1. /* matchstar: 搜索c*regexp的最左一级最长的匹配 */
  2. int matchstar(int c, char *regexp, char *text)
  3. {
  4.     char *t;
  5.     for (t = text; *t != '/0' && (*t == c || c == '.'); t++);
  6.     do { /* 通配符 * 匹配零个或者多个实例 */
  7.         if (matchhere(regexp, t))
  8.             return 1;
  9.     } while (t-- > text);
  10.     return 0;
  11. }


【结论】
什么是代码的优雅和美,在这一章给我的启示是,在处理一个问题时,学会取舍是非常重要的,如何选择一个最小的问题集来精确阐述需要描述的问题,实现时采用什么样的方法,写出紧凑的程序……

程序的美在于取舍!


                           
                                                                                                                                           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值