zoukankan      html  css  js  c++  java
  • 关于pcre正则表达式库libpcre

    gcc 4.8中已经包含了std regex的头文件

    可是没有实现,所以链接是失败的

    gcc 4.9完整的支持了c++ 11的regex。

    在4.9以前,可以寻求boost的regex。

    不过,我更熟悉pcre,基于perl的正则表达式的实现。

    下载源码,解压

    将库配置为交叉编译,只生成静态库,配置pcre代码如下:

    #!/bin/sh
    
    export ROOTDIR="${PWD}"
    cd pcre-8.36/
    
    export CROSS_COMPILE="arm-linux-androideabi"
    
    export AR=${CROSS_COMPILE}-ar
    export AS=${CROSS_COMPILE}-as
    export LD=${CROSS_COMPILE}-ld
    export RANLIB=${CROSS_COMPILE}-ranlib
    export CC=${CROSS_COMPILE}-gcc
    export CXX=${CROSS_COMPILE}-g++
    export NM=${CROSS_COMPILE}-nm
    
    ./configure --prefix=${ROOTDIR}/build/pcre --target=${CROSS_COMPILE} --host=${CROSS_COMPILE} --build=i686-linux --disable-shared

    执行make && make install 编译生成目标文件

    接下来我们开始使用libpcre库

    枚举所有匹配的项,并将结果打印出来,代码如下:

     1 #include "pcre.h"
     2 #include <string>
     3 #include <vector>
     4 #include <iostream>
     5 
     6 int main(void)
     7 {
     8     const int OVECCOUNT = 30; 
     9     std::string src_string = "Saturday=6 and Sunday=7, but some Fridays=5 joke=102 also.";
    10     std::string regex_string = "\w+=\d+";
    11     bool b_case = false;
    12 
    13     const char* error;
    14     int erroffset;
    15     int ovector[OVECCOUNT];
    16     std::vector<std::string> sfinds;
    17     pcre* re = pcre_compile(regex_string.c_str(), b_case ? PCRE_CASELESS : 0,
    18             &error, &erroffset, NULL);
    19     if(re)
    20     {   
    21         unsigned int offset = 0; 
    22         unsigned int len = src_string.size();
    23         const char* str = src_string.c_str();
    24         int rc = 0;
    25         while(offset < len && (rc = pcre_exec(re, 0, str, len, offset, 0, ovector, OVECCOUNT)) >= 0)
    26         {
    27             std::cout << "find count: " << rc << std::endl;
    28             for(int i = 0; i < rc; ++i)
    29             {
    30                 int s_len = ovector[2*i+1] - ovector[2*i];
    31                 std::string sfind = src_string.substr(ovector[2*i], s_len);
    32                 sfinds.push_back(sfind);
    33             }
    34             offset = ovector[1];
    35         }
    36         
    37         pcre_free(re);
    38     }   
    39 
    40     for(size_t i = 0; i < sfinds.size(); ++i)
    41         std::cout << "*" <<sfinds[i] << "* ";
    42     std::cout << std::endl;
    43 
    44     return 0;
    45 }

    编译运行regex,输出结果为:

    find count: 1
    find count: 1
    find count: 1
    find count: 1
    *Saturday=6* *Sunday=7* *Fridays=5* *joke=102*

  • 相关阅读:
    vs2012下如何调试带输入参数的程序
    BASH-数据流重导向
    VS在连接期间的一个错误的处理:转换到 COFF 期间失败: 文件无效或损坏
    vmware中NAT配置不能上网的一个解决方案
    linux下查找
    系统及用户的bash环境配置 学习笔记
    linux中控制台字体和背景颜色配置
    bash中变量的巧用
    vi 常用指令存档
    vim指令示意图
  • 原文地址:https://www.cnblogs.com/jojodru/p/4633675.html
Copyright © 2011-2022 走看看