vc 正则
2010年06月11日
文本字符串的处理、分析一直是写程序中不可避免的问题,长时间以来,自己对正则表达式这个纸老虎一直退避三舍。也许是懒的缘故吧,一般遇到字符串处理问题的时候,都是自己写个小程序完事,但工作效率实在是低下,做的多了就有点烦--都是重复性工作。昨天闲着没事,终于下决心看看正则了,很欣喜,收获还是不小的。
关于正则表达式的学习,推荐这篇文章,"正则表达式三十分钟入门",我这么零基础的人,边看边练,两个小时确实是入门了,所以强烈推荐。其他关于正则的详细内容就不说了,不属于本文讨论的内容,下面言归正传。
学正则表达式,练习是少不了的,虽然工具不少,但为了以后自己写程序时方便,还是决定自己写一个。Google了一下,正则库还真是不少,像 Boost、CAtlReg、Greta等,还有其他很多。粗粗看了一下,觉得Boost块头太大了,还得一步步编译啥的,懒人就放弃了,CAtlreg 又好像不能在VC6下用,看看Greta就6个文件--着实很亲切,所以就它了。
网上关于Greta的文档不是很多,不知道是太简单了还是用的人太少,例子大多也是greta库文件里的示例,太简单,没有详细的匹配、替换、分割功能的用法。
本文测试的环境是VC6(sp6)MFC环境,步骤如下,
1)直接将greta六个源文件拷贝到工程目录下,为了方便,建了个greta目录;
这里测试就直接用了源文件,其实还可以先把greta编译成库文件来使用,更推荐这种用法。
2)包含greta头文件;
#include
#include "greta\regexpr2.h"//这一个就够了
using namespace std;
using namespace regex;//greta库的命名空间
3)在greta两个cpp文件中加上头文件"stdafx.h",否则会报错;
另外,如果仍遇到11个左右的莫名其妙错误时,可以把MFC设置为静态链接模式,我刚开始时候就遇到了这个问题,搞了半天不知道什么原因,后来就改了静态选项;不过写本文时,本来想看看这个错误是什么,好给大家贴出来,把MFC改回共享链接又正常了...那些错误就是搞不出来(bt...)
4)环境设置好,下面就可以使用了;
几个重要的对象:
rpattern--正则模式及设置,主要就用它;
match_results--匹配结果容器;
subst_results--替换结果容器;
split_results--分割结果容器;
基本主要的就这几个了,具体用法,贴代码,大家自己看;
//////////////////////////////////
if( nChar==VK_ESCAPE )
CDialog::OnOK();
else if( nChar==VK_F5 ) //匹配查找
{
UpdateData();
m_strResult = "";
match_results result;
REGEX_FLAGS dw = GLOBAL | ALLBACKREFS;
if( m_bCase ) dw |= NOCASE;
if( m_bMulti ) dw |= MULTILINE;
if( m_bSingle ) dw |= SINGLELINE;
//
double tmS = clock();
//
rpattern pat((LPCTSTR)m_strReg, dw);
int iGroups = pat.cgroups();
int nCount = 0;
match_results::backref_type br = pat.match( (LPCTSTR)m_strSource, result );
if( 0 )//遍历结果方式1,任选一种方式即可
{
match_results::backref_vector vec = result.all_backrefs();
match_results::backref_vector::iterator iter;
if( br.matched )
{
for( iter = vec.begin(); iter != vec.end(); iter++ )
{
nCount++;
string str = (*iter).str();
m_strResult += str.c_str();
m_strResult += "\r\n--------------------------------------------- \r\n";
}
}
}
if( 1 )//遍历结果方式2
{
if( br.matched )
{
for( int i=0;ifms, 共找到 %d个匹配;"), double(tmE-tmS), nCount);
GetDlgItem(IDC_STATIC_TIP)->SetWindowText(strTip);
//
UpdateData(FALSE);
}
else if( nChar == VK_F6 )//替换
{
UpdateData();
m_strResult = "";
//
REGEX_FLAGS dw = GLOBAL | ALLBACKREFS;
if( m_bCase ) dw |= NOCASE;
if( m_bMulti ) dw |= MULTILINE;
if( m_bSingle ) dw |= SINGLELINE;
double tmS = clock();
//
rpattern pat((LPCTSTR)m_strReg, (LPCTSTR)m_strSub, dw);
subst_results subResult;
//
string str((LPCTSTR)m_strSource);
int nCount = pat.substitute(str, subResult);
m_strResult = str.c_str();
//
double tmE = clock();
CString strTip;
strTip.Format(_T(" 运行时间 %.2fms, 共完成替换 %d处;"), double(tmE-tmS), nCount);
GetDlgItem(IDC_STATIC_TIP)->SetWindowText(strTip);
//
UpdateData(FALSE);
}
else if( nChar == VK_F7 )//分割字符串
{
UpdateData();
m_strResult = "";
//
REGEX_FLAGS dw = GLOBAL | ALLBACKREFS;
if( m_bCase ) dw |= NOCASE;
if( m_bMulti ) dw |= MULTILINE;
if( m_bSingle ) dw |= SINGLELINE;
double tmS = clock();
//
rpattern pat((LPCTSTR)m_strReg, dw);
split_results splitResult;
//
string str((LPCTSTR)m_strSource);
int nCount = pat.split(str, splitResult);
for( int ni=0;nifms, 共找到 %d个匹配;"), double(tmE-tmS), nCount);
GetDlgItem(IDC_STATIC_TIP)->SetWindowText(strTip);
//
UpdateData(FALSE);
}
发表评论
-
OpenMeetings的安装
2012-01-20 10:35 786OpenMeetings的安装 2011年0 ... -
视频聊天网站的研究、发展以及趋势(转)
2012-01-20 10:35 854视频聊天网站的研究、发展以及趋势(转) 2010年08月05 ... -
视频聊天网站的研究、发展以及趋势(转) ...
2012-01-20 10:35 678视频聊天网站的研究、发展以及趋势(转) ... 2010年1 ... -
flash录制时出现NetStream.Record.NoAccess错误
2012-01-20 10:35 1071flash录制时出现NetStream.Record.NoAc ... -
ubuntu速配指南之热门设置
2012-01-19 15:38 851ubuntu速配指南之热门设 ... -
建模工具13款
2012-01-19 15:37 1128建模工具13款 2011年02月03日 13个优秀的UM ... -
Cassandra学习笔记
2012-01-19 15:37 1854Cassandra学习笔记 2011年11月16日 ... -
酷壳网陈皓:开发者实用学习资源汇总
2012-01-19 15:37 712酷壳网陈皓:开发者实用 ... -
stardict安装与优化详解
2012-01-19 15:37 944stardict安装与优化详解 2011年10月08日 ... -
紫色朝阳11
2012-01-17 05:22 613紫色朝阳11 2012年01月13日 沉默许久, ... -
神通神变
2012-01-17 05:22 661神通神变 2012年01月13日 。时调达即向舍利弗所. ... -
捷达学校《初级会计实务》考点解析例题---第四章
2012-01-17 05:22 650捷达学校《初级会计实 ... -
公司视角
2012-01-17 05:22 677公司视角 2012年01月13日 ... -
上海之梦
2012-01-16 04:17 725上海之梦 2009年12月01日 来上海马上两年了,真快 ... -
“嗲”上海文化,女人需要学会的4种气质
2012-01-16 04:17 694“嗲”上海文化,女人需 ... -
也说上海女孩的嗲----
2012-01-16 04:17 1179也说上海女孩的嗲---- 2 ... -
撒娇有理?上海女人的嗲文化!
2012-01-16 04:16 839撒娇有理?上海女人的嗲 ... -
上海女人的"嗲"文化
2012-01-16 04:16 707上海女人的"嗲" ...
相关推荐
VC 正则表达式测试器是一个主要适用于C 编程环境,正则表达式是一种对字符进行模糊匹配的一个公式。在数据有效性验证,查找,替换文本中都可以使用正则表达式 。 当然其它语言环境也可以用,不过有时候会不准确,...
在本资源"VC 正则原理提取网页链接.rar"中,我们主要探讨的是如何利用VC++(Visual C++)编程语言结合正则表达式技术来从HTML网页文本中有效地提取出所有的URL链接。这个程序实例对于理解正则表达式在实际编程中的...
一个VC 正则表达式解析库函数库-支持中文字符,原始作者 : lanzhengpeng(兰征鹏),在北京写于创意鹰翔公司。 rf_return= 0x0001,//\r转义为'\r',否则,转义为r rf_multi_line = 0x0002,//全文作为多行匹配。^...
本示例“VC使用正则表达式Demo”旨在展示如何在Visual C++项目中集成和使用正则表达式功能。在实际应用中,正则表达式常用于验证输入数据(如电子邮件地址、电话号码格式)、搜索和替换文本以及从大量文本中提取特定...
1.将boost文件夹完整拷贝到VC6编译环境Include目录下 例如:C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE 2.将lib文件夹内部所有.lib文件拷贝到VC6编译环境lib目录下 例如:C:\Program Files\Microsoft ...
《神奇的匹配:正则表达式求精之旅》从正则表达式的基本概念、基本语法入手,着重于数字验证、字符串验证、数字和字符串混合验证及HTML处理等各个方面的应用。并基于目前流行的程序语言和应用环境(如C#、ASP.NET、...
一个VC++正则表达式 有穷自动机实例源码,请输入正则式( 注意对单个输入有*操作的时候要有$合成,比如求0*,要有($0)* ): 。编译后程序会生成一个可执行文件,运行这个文件出来一个DOS窗口,然后按提示输入正则...
在VC++环境中,MFC(Microsoft Foundation Classes)库提供了一个强大的工具来实现正则表达式操作,这在处理文本分析和数据提取时尤其有用。在这个“VC++ MFC 正则表达式编程小例”中,我们将深入探讨如何在MFC应用...
《greta-2.6.4-vc6正则表达式》 正则表达式(Regular Expression)是一种强大的文本处理工具,广泛应用于编程语言、文本编辑器和各种软件中,用于搜索、匹配、替换和提取文本模式。在本文中,我们将深入探讨greta-...
在Windows环境下,VC6(Visual C++ 6.0)是一款经典的C/C++集成开发环境,而PCRE(Perl Compatible Regular Expressions)则是一个强大的正则表达式库,广泛应用于各种编程语言中,包括C/C++。这个压缩包提供的是预...
"VC、VC++,MFC 正则表达式类库"指的是在MFC中实现或集成的正则表达式处理模块。这个库通常包含一系列的类和函数,允许程序员编写符合特定模式的字符串匹配、替换和分割等操作。在标准C++库中,虽然没有内置的正则...
"VC_正则表达式.rar"这个压缩包文件显然包含了与在Visual C++环境下使用正则表达式的相关资料。 "ValidDate.cpp"可能是一个示例程序,它演示了如何在C++中使用正则表达式来验证日期格式。在C++中,正则表达式的实现...
例如,`re_syntex.inl`可能包含正则表达式的语法解析逻辑,`re_traits.inl`可能涉及字符特性的定义,而`re_detail_vc6.inl`可能是针对VC++ 6.0版本的一些特定实现或优化。 5. **re_history.txt**: 这个文件记录了库...
在本教程中,我们将深入探讨如何在Visual C++(简称VC)环境中利用正则表达式进行字符串处理,同时解决可能出现的“VC greta”错误问题。 首先,让我们了解什么是正则表达式。正则表达式是由字符和特殊符号组成的...
在VC编程中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员用简洁的模式匹配和处理字符串。正则表达式在各种编程语言中都有应用,包括C++,而VC(Visual C++)是Microsoft提供的一个C++...
PCRE是一个开源的C语言库,它实现了Perl风格的正则表达式功能。这个库被广泛用于各种软件项目,包括Web服务器、数据库和文本处理工具等。版本8.35包含了对多种正则表达式特性的支持,如回溯限制、Unicode字符集支持...
用于多字节字符集项目转换为UNICODE字符集代码转换时,提高代码修改效率,将""替换为_T(""),以及_T("")替换为"
C++正则表达式是C++11标准引入的一个强大工具,它允许程序员使用正则表达式进行文本模式匹配和搜索。在这个特定的案例中,我们关注的是`regex`类,它是C++ `<regex>`库的一部分,用于实现正则表达式操作。这个压缩包...