[原创]C语言利用pcre正则表达式库
C语言使用正则表达式,可以利用pcre库,这个比较不错的哦。
在使用过程中,利用python进行测试正则表达式是否OK,后发现出现了问题。如下所示:
regex.c:11:18: warning: unknown escape sequence: '\/' [enabled by default]
char* url_re="(https?|ftp|mms):\/\/([A-z0-9]+[_\-]?[A-z0-9]?\.)*[A-z0-9]+\-?[A-z0-9]+\.[A-z]{2,}(\/.*)?";
^
regex.c:11:18: warning: unknown escape sequence: '\/' [enabled by default]
regex.c:11:18: warning: unknown escape sequence: '\-' [enabled by default]
regex.c:11:18: warning: unknown escape sequence: '\.' [enabled by default]
regex.c:11:18: warning: unknown escape sequence: '\-' [enabled by default]
regex.c:11:18: warning: unknown escape sequence: '\.' [enabled by default]
regex.c:11:18: warning: unknown escape sequence: '\/' [enabled by default]
这到底怎么回事呢?利用Python执行结果是OK的呀。代码如下:
#!/usr/bin/env python
#
import re
import sys
import os
#restr="(https?|ftp|mms):\/\/([A-z0-9]+[_\-]?[A-z0-9]+\.)*[A-z0-9]+\-?[A-z0-9]+\.[A-z]{2,}(\/.*)*\/?"
def geturl(url=''):
restr="(https?|ftp|mms):\/\/([A-z0-9]+[_\-]?[A-z0-9]?\.)*[A-z0-9]+\-?[A-z0-9]+\.[A-z]{2,}"
pattern = re.compile(restr)
match=re.search(pattern, url)
if match:
return match.group()
################# GetLine ############################
def dealUrl(fmtfile):
i=0
file = open(fmtfile,'r')
fo = open("tmp.txt",'w')
while 1:
line = file.readline()
if not line:
break
newline=geturl(line)
if(newline!=None):
print(i, newline)
fo.writelines(''.join([newline,'\n']))
i+=1
################# Main ##############################
if __name__=='__main__':
if(len(sys.argv)<2):
filename='url.info'
else:
filename=sys.argv[1]
dealUrl(filename)
查询后,发现有可能是在C语言中,如果使用正则表达式,那么转移字符需要使用双份的,也即:"/"需要用“\\/”,对url_re做了调整后,再次测试发现编译告警消失,执行结果也是OK啦。
int filter(char* str,char* url)
{
pcre *re;
const char* error;
int erroffset;
int ovector[RE_OVERCOUNT];
int rc;
char* url_re="(https?|ftp|mms):\\/\\/([A-z0-9]+[_\\-]?[A-z0-9]?\\.)*[A-z0-9]+\\-?[A-z0-9]+\\.[A-z]{2,}"; if(str==NULL || url==NULL) return ;
printf("str: %s\n", str);
re = pcre_compile(url_re, , &error, &erroffset, NULL);
if(re == NULL){
printf("PCRE pcre_compile failed at offset %d: %s\n", erroffset, error);
return ;
}
char *p=str;
if((rc=pcre_exec(re,NULL,p,strlen(p),,,ovector,RE_OVERCOUNT))!=PCRE_ERROR_NOMATCH){
char* url_start = p + ovector[];
int urllen = ovector[] - ovector[];
strncpy(url, url_start, urllen);
printf("urllen %d, url:%s\n", urllen, url);
return urllen;
}
pcre_free(re);
return ;
}
[原创]C语言利用pcre正则表达式库的更多相关文章
- 关于pcre正则表达式库libpcre
gcc 4.8中已经包含了std regex的头文件 可是没有实现,所以链接是失败的 gcc 4.9完整的支持了c++ 11的regex. 在4.9以前,可以寻求boost的regex. 不过,我更熟 ...
- 在C语言中利用PCRE实现正则表达式
1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...
- 编译 pcre - 开源的正则表达式(库)
PCRE百科介绍: PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库.这些在执行正规表达式模式匹配时用与Perl ...
- 深入浅出C/C++中的正则表达式库
写在前面: 本文是面向有正则表达式基础的读者朋友的,如果你还不知道正则表达式是什么,请先到这里学习一下 :http://en.wikipedia.org/wiki/Regular_expressio ...
- 值得学习的C语言开源项目和库
收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...
- PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...
- 在C++ Builder6上使用Boost正则表达式库
本文关键词:正则表达式 c++ python 软件 正则表达式是一种模式匹配形式,它通常用在处理的文本程序中.比如我们经常使用的grep工具,还是perl语言都使用了正则表达式. 正则表达式是一种模式 ...
- 利用私有的库MobileCoreServices检测正在安装的应用
利用的私有库检测正在安装的app 分为两步:第一,通过placeholderApplications获得所有的正在安装的app的信息 第二,遍历正在安装的app的信息,根据名称获得你想检测的app是否 ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
随机推荐
- POJ3253Babelfish
http://poj.org/problem?id=3253 就是一个哈夫曼树,题目下边有提示,所以题意还是好理解的 #include<cstdio> #include<cstrin ...
- Mysql 1030 Got error -1 from storage engine 错误解决
检查你的my.cnf或my.ini,里面会有一个参数innodb_force_recovery,你看看他的值,默认是没有这个参数,没有的话,他的默认值是0,这个参数的值如果大于0,innodb会被禁止 ...
- 深入浅出Java并发包—锁(Lock)VS同步(synchronized)
今天我们来探讨一下Java中的锁机制.前面我们提到,在JDK1.5之前只能通过synchronized关键字来实现同步,这个前面我们已经提到是属于独占锁,性能并不高,因此JDK1.5之后开始借助JNI ...
- VC error LNK2005 解决办法
error LNK2005: "int __cdecl VerifyVMR9(void)" (?VerifyVMR9@@YAHXZ) 解决办法 在 属性->配置属性-> ...
- Git教程之版本回退(4)
现在,我们已经学会了修改文件,然后把修改提交到Git版本库,现在再次修改readme.txt文件如下:
- Android PullToRefreshExpandableListView的点击事件
这几天做项目的时候用到了一个开源的下拉刷新的框架(需要的朋友可以加我Q:359222347).其中我使用PullToRefreshExpandableListView的时候发现这个东西没有setOnC ...
- tomcat 内存配置
在bin目录下的catalina.bat里添加如下代码: rem ----- Execute The Requested Command ------------------------------- ...
- 让你了解x86的中断
COPY FROM:http://zhan.renren.com/qdlinux?gid=3602888498000980107&from=post&checked=true 研究li ...
- PHP的线程安全与非线程安全版本的区别
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- null和""的区别
从字面上看,null表示空(用str==null判定),""表示空字符串(用str.equals("")或者str.length()==0判定) 问题一: nu ...