almost 6 years ago

前言

由於網路程式設計課程的關係需要在C++中用到Regular expression,
google之後發現有許多解決方案,如Regex++ 、 Boost.Regex 、 PCRE 、 regix.h 等等,
但考慮到系上工作站未必有安裝上述套件,而PCRE卻是人人都有,
所以我選擇使用pcrecpp這個lib。

安裝

  • Environment: FreeBSD 8.2
% sudo portmaster devel/pcre++

使用

  • CASE 1: FULLMATCH & PARTIAMATCH

    FullMatch就是需要完全相符,就像/^(regular expression code)$/一樣
    PartialMatch則反之

#include <iostream>
#include <pcrecpp .h>
  
int main(int argc, char ** argv)
{
    if (argc != 3)
    {   
        std::cerr < < "Usage: " << argv[0] << " pattern text\n";
        return 1;
    }   
  
    pcrecpp::RE oPattern(argv[1]);
    if (oPattern.FullMatch(argv[2]))
    {   
        std::cout << argv[2] << " fully matches " << argv[1] << "\n";
    }   
    else if (oPattern.PartialMatch(argv[2]))
    {   
        std::cout << argv[2] << " partially matches " << argv[1] << "\n";
    }   
    else
    {   
        std::cout << argv[2] << " dose not match " << argv[1] << "\n";
    }   
}

執行結果

% g++ TestPcre Cpp.cpp `pcre-config --cflags` `pcre++-config --cflags` -   lpcrecpp -o pcrecpp
% ./pcrecpp 
Usage: ./pcrecpp pattern text
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.com"
http://www.qq.com fully matches http:\/\/.*\.qq\.com
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.comiii"
http://www.qq.comiii partially matches http:\/\/.*\.qq\.com
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qqq.comiii"
http://www.qqq.comiii dose not match http:\/\/.*\.qq\.com
  • CASE 2:CONSUME之完全比對

    有時候你會想把整個字串比對完,像是你想parse一整篇html或文章中所有的email,你或許會這樣寫

string contents = ...;                 // Fill string somehow
pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
string name, site;
pcrecpp::RE re("([^@]+)@([^\s]+)");
while (re.Consume(&input, &name, &site)) {
  ...;
}

然後就可以成功抓到一篇文章所有的email。

切記,StringPiece一定要記得Wrap,否則會型態不符喔!

Note

經實際測試結果,compile時必須加上

% g++ `pcre-config --cflags` `pcre++-config --cflags` -lpcrecpp

才可以成功compile,且如果他說找不到lpcrecpp請手動symbolic link到/usr/bin下才可執行

% sudo ln -s /usr/local/lib/libpcrecpp.so.0 /usr/lib/

Reference

 
comments powered by Disqus