关于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*

时间: 2024-11-06 03:46:28

关于pcre正则表达式库libpcre的相关文章

编译 pcre - 开源的正则表达式(库)

PCRE百科介绍: PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库.这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的.Boost太庞大了,使用boost regex后,程序的编译速度明显变慢.测试了一下,同样一个程序,使用boost::regex编译时需要3秒,而使用pcre不到1秒.因此改用pcre来解决C语言中使用正则表达式的问题 pcre库官网:http://www.pcre.o

深入浅出C/C++中的正则表达式库

写在前面: 本文是面向有正则表达式基础的读者朋友的,如果你还不知道正则表达式是什么,请先到这里学习一下  :http://en.wikipedia.org/wiki/Regular_expression. 正则表达式(Regular Expressions),又被称为regex或regexp,是一种十分简便.灵活的文本处理工具.它可以用来精确地找出某文本中匹配某种指定规则的内容.在Linux下,grep, sed, awk等工具都支持正则表达式,这些工具的存在,为我们日常的文本处理带来了极大的便

C中调用pcre正则库

分类: C/C++ 在Linux的C标准库中包含了一个正则库(Windows下无此正则库),只需要引用<regex.h>即可使用,但是使用了几天却发现Linux自带的正则库无法使用元字符和非贪婪匹配,例如: str:   1.1.1.1 regex: (\d*.\d*.\d*.\d*) 其中的正则表达式使用了元字符\d来匹配数字,但在regex.h的正则库中却无法匹配. str:   \<br\>123\<br\>456\<br\> regex: \<

转:php pcre正则表达式完全教程----pcre官方文档

转自:http://yuanlanxiaup.iteye.com/blog/1330159 PCRE 简介 PCRE 扩展的正则表达式会有一个每个线程都可用的全局缓存用来缓存编译后的正则表达式. PCRE在php4.2.0中是默认启用的, 可以通过—without-pcre-regex禁用. 在php 5.3.0之后, 这个扩展不能被禁用. 但是仍然可以使用—with-pcre-regex=DIR来实用一个外部的pcre库进行编译 配置 pcre.backtrack_limit: 默认10000

C++11 正则表达式库 (regex)

Source: http://cpprocks.com/wp-content/uploads/c++11-regex-cheatsheet.pdf C++11 正则表达式库 (regex),布布扣,bubuko.com

ATL正则表达式库与CAtlRegExp的使用

正则表达式是最强大的文本解析工具之一, 在ATL中也提供了一些用于正则表达式的类库(CATLRegExp等),本文将简要说明这些类库的使用方法. 1.CATLRegExp类 声明: template <class CharTraits=CAtlRECharTraits> class CAtlRegExp; 初始化: 与微软的GRETA类库(微软研究院推出的另一个正则表达式类库)不同,CATLRegExp并没有在构造函数中提供初始化匹配字符串的方法,而是让使用者通过调用它的Parse()方法,使

【regex】POSIX标准正则表达式库

在linux C 下面没有编译成功使用?号的非贪婪模式. 网上的一句话:the ? only works for Perl-based regexp, not for POSIX... 如果需要使用非贪婪模式匹配,可以使用boost的正则表达式库

[C/C++11]_[初级]_[使用正则表达式库regex]

场景 正则表达式在处理非常量字符串查找,替换时能很省事,如果稍微复杂点的字符串匹配, 没有正则表达式还真做不出来. C++11 为我们提供了正则表达式库. 使用起来比boost的正则库方便. 搞Java 的一定觉得很搞笑,这都是Java的标配功能, 怎么C++11才支持这个库,vs2010 以才支持.建议在处理字符串搜索替换时,直接用正则吧,代码量少,快速. 参考 std::regex_replace std::regex_iterator Regular Expressions (C++) 说

在C++ Builder6上使用Boost正则表达式库

本文关键词:正则表达式 c++ python 软件 正则表达式是一种模式匹配形式,它通常用在处理的文本程序中.比如我们经常使用的grep工具,还是perl语言都使用了正则表达式. 正则表达式是一种模式匹配形式,它通常用在处理的文本程序中.比如我们经常使用的grep工具,还是perl语言都使用了正则表达式.传统的C++处理正则表达式是非常麻烦的,这也成为很多其他语言爱好者的笑柄,现在情况不一样了,因为有了boost. Boost是一个基于Template的开发源代码库,在这个库中有很多子库用来高效