over 10 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/