c 语言编写-类正则表达式函数

源码地址:https://github.com/guonaihong/char_engine/blob/master/str_match.c


str_match一个简单的例子:

str_match("192.168.1.1", "%d.%d.%d.%d"); /*match ok */

str_match("aa:bb:cc:dd:ee:ff", "%2[a-z]:%2[a-z]:%2[a-z]:%2[a-z]:%2[a-z]:%2[a-z]"); /* match ok*/


与perl原字符的区别:

%d       \d+

%f       \d+.\d+

%[...]   [...]+

%[^...]  [^...]+

%?       ?

以上原字符除%?不支持宽度修饰,其余都可以。width 加在%后面。示例如下:

%width d

......

TDDO

支持区间量词

{min,max}

str_match("1111.168.1.1", "%{1,3}d.%{1,3}d.%{1,3}d.%{1,3}d"); /*match no */

DIY str_match 原因

以后再遇到c语言中匹配数据的情形,可以懒点,少写代码。

str_match 构思最出彩的地方

支持 %[] 字符组。

  1. 考虑速度,选择数据结构

    每来个字符与字符组数据比较,最慢的方式是挨个比较。如下伪代码。

    if (c == ' ' || c == '\t' || c == '\n')

    dosomething

    如果 c 是 0的话就要比较3次。一次不见的什么,如果来的字符很多,都不是这3个字符的一种。 就需要

    判断 3 * n 次。

    查找速度比较快的数据结构有 哈希表,如果只是数字的话还可以考虑位图。就像POSIX 规定的select 在linux 下的实现,就用

    到了位图。

  2. [0-9] [a-z] [A-Z]...区间式写法解析

    区间式写法可以用循环的方式把这段字符设进位图。

  3. [^...] 对字符组取反。

    对位图取反


你可能感兴趣的:(c,正则表达式)