程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC6.0下配置boost庫使用正則表達式

VC6.0下配置boost庫使用正則表達式

編輯:vc教程

最近做開發碰到了長字符串匹配、搜索的問題,最先想到的是使用正則表達式,簡單、高效。

但是我用的開發工具是VC6.0,不支持正則表達式。

上網baidu一下,發現支持正則的庫還真不少,大概有以下幾種:boost,GNU,VC7帶的ATL中的和微軟發布的greta。

網上的朋友對boost評價不錯,決定就使用是它了!

1、接下來的就是下載boost庫,網上很好找。我下載的是壓縮包,20多M,解壓後將近100多M。

我解壓的目錄是D:oost

2、然後是編譯,我只要支持正則表達式就可以,因此只需要編譯D:oostlibs egexuild目錄下的文件。據說全部編譯要花將近2個小時,沒有驗證過,在我家裡的機器上編譯正則表達式部分只用了不到5分鐘。

網上介紹的如何編譯最多的一篇文章是“VC利用boost庫解析正則表達式”,如果有人能根據這篇文章編譯成功不妨告訴小弟一聲……

以下是我的操作:


在“運行”裡輸入“cmd”,打開命令提示符;

輸入命令“cd D:oostlibs egexuild”//設置當前目錄

輸入命令“D:”//轉到當前目錄

接下來是很關鍵的一步:
很多文章是這樣說的“輸入 nmake -fvc6.mak”
但是出現了“'nmake' 不是內部或外部命令,也不是可運行的程序或批處理文件。”的錯誤提示。
然後你就會拼命查找原因,結果又有文章上說是環境變量沒配置好,然後給出一堆“set”。
也有的文章說是運行一下visual studio安裝目錄下的VC98BinVCVARS32.BAT文件就OK了。
你按照文章作者的方法做的,結果發現問題依舊!
以上說法都是正確的,但是說得都不是很完整,出現錯誤提示的根本原因就是環境變量沒配置好,不識別nmake命令,配置過jdk的朋友就很容易明白。如果按照作者的要求搞一堆“set”,未免大題小作了吧,因為我們只需要用一次'nmake' 就可以解決問題了。
VCVARS32.BAT正式配置環境變量的批處理文件,但是配置的參數只在當前窗口有效,也就是說當你雙擊運行後窗口關閉,環境變量已經沒有了。

於是我用了以下方法:
把VCVARS32.BAT文件用鼠標拖到打開的cmd窗口("D:Program FilesMicrosoft Visual StudioVC98BinVCV
ARS32.BAT"),然後回車。

輸入命令“nmake -fvc6.mak”

等待幾分鐘,OK了!,D:oostlibs egexuild多了一個vc6的文件夾,裡面是很多lib和dll文件。

3、到此資源已經准備好了,下面要做的工作是配置VC6.0,使它編譯使時候能找到正則庫。

把vc6下的所有lib和dll文件拷貝到Visual Studio安裝目錄下的VC98oostRex(boostRex是我自己建的)

然後打開vc6.0,選擇“Tools->Options->DirectorIEs->Include files”,加入一行“D:BOOST”

選擇“Tools->Options->DirectorIEs->Library file”,加入一行“C:PROGRAM FILESMICROSOFT VISUAL STUDIOVC98BOOSTREX”(彩色部分是我的Visual Studio安裝目錄)

配置也OK了!

4、編寫程序測試

SDK下的測試:


#include "stdafx.h"
#include <cstdlib>
#include <stdlib.h>
#include <boost/regex.hpp>
#include <string>
#include <iOStream>

using namespace std;
using namespace boost;

regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");

int main(int argc, char* argv[])
{
std::string in;
cmatch what;
cout << "enter test string" << endl;
getline(cin,in);
if(regex_match(in.c_str(), what, expression))
{
   for(int i=0;i<what.size();i++)
    cout<<"str :"<<what.str()<<endl;
}
else
{
   cout<<"Error Input"<<endl;
}
return 0;
}

輸入: select name from table
輸出: str:select name from table
   str:name
   str:table

MFC下的測試(有幾個地方要注意,下面有提示):


新建一個對話框的MFC工程,
加入頭文件
#include <boost/regex.hpp>

在按鈕鼠標單擊事件響應函數中加入
boost::regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");
CString in = "select gm from tab";
CString sRet;
boost::cmatch what;
if(boost::regex_match(LPCSTR(in), what, expression))//CString轉string
{
   for(int i=0;i<what.size();i++){
    sRet = (what.str()).c_str();//string轉CString
    MessageBox(sRet);
   }
}
else
{
   MessageBox("Error Input");
}

輸出的結果跟上面一樣。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved