VC6.0下配置boost庫使用Regex

來源:互聯網
上載者:User
 最近做開發碰到了長字串匹配、搜尋的問題,最先想到的是使用Regex,簡單、高效。

但是我用的開發工具是VC6.0,不支援Regex。

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

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

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

我解壓的目錄是D:/boost

2、然後是編譯,我只要支援Regex就可以,因此只需要編譯D:/boost/libs/regex/build目錄下的檔案。據說全部編譯要花將近2個小時,沒有驗證過,在我家裡的機器上編譯Regex部分只用了不到5分鐘。

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

以下是我的操作:

在“運行”裡輸入“cmd”,開啟命令提示字元;

輸入命令“cd D:/boost/libs/regex/build”//設定目前的目錄

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

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

於是我用了以下方法:
把VCVARS32.BAT檔案用滑鼠拖到開啟的cmd視窗("D:/Program Files/Microsoft Visual Studio/VC98/Bin/VCV
ARS32.BAT"),然後斷行符號。

輸入命令“nmake -fvc6.mak”

等待幾分鐘,OK了!,D:/boost/libs/regex/build多了一個vc6的檔案夾,裡面是很多lib和dll檔案。

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

把vc6下的所有lib和dll檔案拷貝到Visual Studio安裝目錄下的VC98/boostRex(boostRex是我自己建的)

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

選擇“Tools->Options->Directories->Library file”,加入一行“C:/PROGRAM FILES/MICROSOFT VISUAL STUDIO/VC98/BOOSTREX”(彩色部分是我的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");
}

輸出的結果跟上面一樣。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.