對于C++下的正則表達式,我想用得比較多的應該就是Boost里的regex了。自從BCB2009自帶了Boost1.35以后,這個regex也自然進入了BCB自帶的功能行列。
對于還沒用上BCB2009的人來說也不用為了一個正則表達式功能急著找boost的安裝方法,其實BCB6早已經幫我們準備好了:TRegexp和pcre庫。不過當年Borland也太“謙虛”了點,竟然沒把這么重要的功能寫進幫助?!!
先看看輕量級的TRegexp
說它是輕量級是因為它沒有完整支持正則表達式,功能也很單一,只有一個find。看下面代碼演示:
#include <stdio.h>
#include <stdlib.h>
#include <regexp.h>
int main(int argc, char* argv[])
{
char szReg[]="[0-9]+"; // 正則表達式,表示一個或多個'0'到'9'的字符串
char szStr[]="a123b03ad94fg45"; // 待匹配的字符串
printf("Regex: %s/n",szReg);
printf("Str: %s/n",szStr);
printf("Result: /n");
TRegexp regex(szReg);
for(size_t len=0, nPos = regex.find(szStr,&len); // 用find查找匹配的字符串。nPos返回子串位置[size_t(-1)表示沒找到匹配的字符串],len返回子串長度
nPos!=size_t(-1);
nPos = regex.find(szStr,&len,nPos+len)) // 從nPos+len位置開始繼續查找...
{
printf("%.*s/n", len, szStr+nPos); // 打印出查找結果
}
system("pause");
return 0;
}
雖然就一個find,功能是寒磣了一點,好在使用還算方便。在它的基礎上做Match和Replace的功能也應該不算太難的事。
對正則表達式比較熟悉的朋友一定在想為什么不把char szReg[]="[0-9]+";改成char szReg[]="//d+";呢?這就是偶說它功能還不完整的原因,它不支持'/'操作符!(也許有其它替代,反正偶沒找到,要是哪位路過的知道TRegexp使用'/'的方法,一定要留個言哦)。
于是,下面我們請出完美的pcre庫。pcre庫的全稱是:Perl-compatible regular expressions。從名稱上可以看出它遵循的是Perl的正則表達式語法,功能那是絕對沒得說。不過遺憾的是BCB沒有進一步把pcrecpp也帶進來,所以只能用純C的方式調用了:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pcre.h>
int main(int argc, char* argv[])
{
char szReg[]="d(//d+)f"; // 抽出a和f之間的數字
char szStr[]="a123b03ad94fg45";
printf("Regex: %s/n",szReg);
printf("Str: %s/n",szStr);
printf("Result: /n");
const char *pszErr;
int nErrOffset;
pcre *re = pcre_compile(szReg,0,&pszErr,&nErrOffset,NULL); // 先準備表達式
if(re==NULL)
{
printf("compile error at:%d, %s", nErrOffset, pszErr);
return -1;
}
int ovector[30]; // 數量由szReg決定,大致為(括號對數+1)*3,可以用pcre_info獲得或者直接留大一點。
int len = strlen(szStr);
int rc = pcre_exec(re, NULL, szStr, len, 0, ovector, 30); // 執行匹配
for(int i=0; i<rc; i++)
{
char *substring_start = szStr + ovector[2*i];
int substring_length = ovector[2*i+1] - ovector[2*i];
printf("%2d: %.*s/n", i, substring_length, substring_start);
}
free(re); // 別忘了這個
system("pause");
return 0;
|