destinyRegex

C/C++ Regex/Regular Expression(C/C++正则表达式库实现)

destinyRegex
        destinyRegex
    Regex:
    Regular Expression(C/C++正则表达式库实现)
    已实现C和C++的接口
    使用时包含headers.h头文件
    
    author:	Sword-Destiny
    作者:	天命剑主(武汉大学国际软件学院2013级袁浩)
    QQ:	1948281915
    邮箱:	[email protected]
    
    version: 0.1

C++:示例文件test.cpp

    语法:
    各个特殊字符含义如下定义
    #define OR_CHAR '|'
    #define LEFT_LARGE_BRACE '{'
    #define RIGHT_LARGE_BRACE '}'
    #define LEFT_MID_BRACKET '['
    #define RIGHT_MID_BRACKET ']'
    #define LEFT_BRACKET '('
    #define RIGHT_BRACKET ')'
    #define CHANGE_LETTER '\\' //双斜线转义
    #define TAB 't' //需要转义
    #define RETURN_ 'r' //需要转义
    #define NEW_LINE 'n' //需要转义
    #define NEW_PAGE 'f' //需要转义
    #define TAB_V 'v' //需要转义
    #define BLANK ' ' //空格
    #define COMMA ',' //逗号
    #define DOT '.' //通配符
    #define MULTI_MATCH_LETTER '*' //多次匹配符
    #define QUES '?' //0或1个
    #define PLUS '+' //一个或多个
    #define DECIMAL 'd' //一个十进制数字,需要转义
    #define LOWER_LETTER 'l' //一个小写字母,需要转义
    #define SPACE 's' //一个空白符(空格符,制表符等),需要转义
    #define UPER_LETTER 'u'//一个大写字母,需要转义
    #define SIMPLE_LETTER 'w' //一个字母a~z或A~Z或数字0~9或下划线_,需要转义
    #define NOT_DECIMAL 'D' //除了\d之外的字符,需要转义
    #define NOT_LOWER_LETTER 'L' //除了\l之外的字符,需要转义
    #define NOT_SPACE 'S' //除了\s之外的字符,需要转义
    #define NOT_UPER_LETTER 'U' //除了\u之外的字符,需要转义
    #define NOT_SIMPLE_LETTER 'W' //除了\w之外的字符,需要转义
    #define RANGE_LETTER '-' //范围表示符

    \是转义符
    t,r,n,f,v等普通字符通过转义可以作为特殊字符
    -,.+*\?{}[]()等具有特殊用途的符号经过转义之后可以作为普通字符
    \t 横向tab
    \n 换行
    \r Return
    \f 换页
    \v 纵向tab

    |代表逻辑或,比如[a]{2,3}[b]{2}|[c]{2,7}
    由|符分割出来的表达式[a]{2,3}[b]{2}和[c]{2,7}称为"情形"或"匹配条件"

    [a]{2,3}[b]{2}又可以分为[a]{2,3}和[b]{2},称为单一情形或者单一匹配条件

    单一匹配条件 组成 匹配条件
    匹配条件 组成 正则表达式

    单一匹配条件 = 可选字符 + 匹配次数

    可选字符:
    []之间的字符代表可选字符,如[a\.\?b]代表   a或b或.或?
    单独的字符或者转义字符等同于可选字符,即a等同于[a],\d等同于[\d]

    匹配次数:
    {}代表匹配次数,如{2}代表匹配2次,{2,4}代表匹配2-4次,{3,}代表匹配大于等于3次,
    后面一个数字不能大于前面的数字,比如{2,1}是非法的,{}前面必须为可选字符

    匹配次数可以省略,缺省值为{1}

    一个字符串只要和任何一个"匹配条件"相匹配即视为和整个正则表达式相匹配

    regex_match返回字符串是否与正则表达式匹配
    regex_search返回字符串是否存在与正则表达式匹配的子串

    sregex_token_iterator类使用正则表达式分割字符串,比如字符串baaabbaabbab
    可以被正则表达式[a]{2,3}分割为 b,aaa,bb,aa,bbab
    而不是 b,aa,abb,aa,bbab
    因为在分割时优先考虑较长的匹配,所以[a]{2,3}优先匹配aaa而不是aa
    最后的sregex_token_iterator中包含的字符串为b,bb,bbab

    不同的是,在regex_match和regex_search中优先考虑较短的匹配

    NOTICE:暂时不支持使用()进行多个正则表达式的连接

    C++的版本使用的是作者自己写的string类,作者为了模仿C++11标准库中得std::string类把该类写得
    和std::string的用法都差不多,所以大家在使用时要注意命名空间的变化,不要把这两个类弄混了

C:示例文件test.c

    正则表达式基本语法与C++相同,参照C++,具体使用参照test.c
    不同的是在C语言的版本中没有sregex_token_iterator类,所以直接给出了regex_splite函数,分割后的
    字符串存放于regex结构体中,具体情况可以看test.c示例代码
    
    C语言的版本中不仅在regex->token_strs中得到分割的字符串,
    还可以在regex->match_strs中得到匹配的字符串,
    比C++版本强大一些
    
    C++的版本没有提供regex_splite函数,而是提供了sregex_token_iterator类.之所以如此,
    是因为作者在模仿C++11标准库中的sregex_token_iterator的语法,
    大家很容易就可以自己参照C版本写出C++版本的代码

Linux*: 不得不承认在使用VS时编译都没有问题,最后使用GCC编译时发现GCC中ISO C标准不支持for循环初始化变量,
而且不支持内联函数所以在编译时需要特定的选项-std=c11,而且由于源文件编码格式是GBK,C版本编译不能通过
C版本编译能通过,不过执行时出现中文乱码,所以最后向度娘问了一下,使用如下命令编译C语言版本:
gcc test.c -O5 -o test -std=c11 -finput-charset=GBK -fexec-charset=UTF-8
对应的C
编译命令:
g++ test.cpp -O5 -o testcpp -std=c++11 -finput-charset=GBK -fexec-charset=UTF-8