C/C++ Regex/Regular Expression(C/C++正则表达式库实现)
destinyRegexRegex: 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