deelx是一个C++写成的非常优秀的正则表达式库,我在开发menthol语言时,Regex模块就是采用了deelx。
对于deelx官方说法:
deelx 是一个在 C++ 环境下的与 Perl 兼容的正则表达式引擎。是 RegExLab 开展的一个研究开发项目。
基本特点:
- 支持与 Perl 兼容的正则表达式语法。
- 支持 IGNORECASE, SINGLELINE, MULTILINE 等常见匹配模式。
- 兼容性强,能在 vc6, vc7, vc8, gcc, Turbo C++ 等大多数 C++ 环境编译。
- 支持命名分组,条件表达式,递归表达式等多种高级特性。(1.2版本新特点)
deelx的使用非常简单,就一个头发文件deelx.h,100来K,不过功能丝毫不逊色,完成我们日常的开发、使用,绰绰有余.
1.调用构造方法
CRegexpT(const CHART * pattern, int flag = NO_FLAG);
pattern为正则表达式
2.替换后得到的新字符串。
CHART * Replace(const CHART * str, const CHART * rplto, int start = -1, int ntimes = -1) const;
这个新字符串是替换过程中分配的字符串,使用完毕后,需要调用 CRegexpT::ReleaseString 进行释放。
实例:
static CRegexpT<char> regexp(正则表达式);
char* s = regexp.Replace(被替换的字符串, 替换为字符串);
regexp.ReleaseString(s);
3.返回非零值表示匹配成功,返回 0 表示匹配失败。
int IsMatched() const;
4.回匹配结果 MatchResult 对象。
MatchResult Match(const CHART * tstring) const;
通过 MatchResult 对象,可以得知是否匹配成功。如果成功,通过 MatchResult 对象可以获取捕获信息。
实例:
static CRegexpT<char> regexp(正则表达式);
MatchResult result = regexp.Match(字符串);
while (result.IsMatched())
{
return true;
}
return false;
5.获取开始位置,匹配成功后,获取所匹配到的子字符串的开始位置。如果匹配失败,则返回负值。
int GetStart() const;
6.获取结束位置,匹配成功后,获取所匹配到的子字符串的结束位置。如果匹配失败,则返回负值。
int GetEnd() const;
7.返回最大分组编号。
int MaxGroupNumber() const;
8.获取分组开始位置.返回指定分组捕获的字符串的开始位置。如果指定分组未捕获,则返回负值。
int GetGroupStart(int nGroupNumber) const;
9.获取分组结束位置.返回指定分组捕获的字符串的结束位置。如果指定分组未捕获,则返回负值。
int GetGroupEnd(int nGroupNumber) const;
10.匹配准备.经过初始化的查找匹配上下文对象,用来在 Match(CContext * pContext) 中使用。
CContext * PrepareMatch(const CHART * tstring) const;
11.由 PrepareMatch 返回的上下文对象。
static void ReleaseContext(CContext * pContext);
12.释放字符串.释放由 Replace 返回的字符串。
static void ReleaseString(CHART * tstring);
实例:
char* pText = (字符串);
static CRegexpT<char> regexp(正则表达式);
CContext * pContext = regexp.PrepareMatch(pText);
MatchResult result = regexp.Match(pContext);
while (result.IsMatched())
{
int start = result.GetStart();
int end = result.GetEnd();
char* s0 = (char*)malloc(end - start + 1);
memset(s0, 0, end - start + 1);
s0[end - start] = 0;
strncpy(s0, pText + start, (pText + end) - (pText + start));
printf("%s",s);
free(s0);
for (int i = 1; i <= result.MaxGroupNumber(); i++){
int _start = result.GetGroupStart(i);
int _end = result.GetGroupEnd(i);
char* s = (char*)malloc(_end - _start + 1);
memset(s, 0, _end - _start + 1);
s[_end - _start] = 0;
strncpy(s, pText + _start, (pText + _end) - (pText + _start));
printf("%s",s);
free(s);
}
result = regexp.Match(pContext);
}
regexp.ReleaseContext(pContext);
以上便是deelx基本全部的函数和方法,可以说基本没有使用难度,非常小巧灵活,十分易于开发,如果想了解更多的使用方法
可以查看我开发的menthol语言的Regex模块实现