我正在开发一个在VS 2008中开发的MFC / C ++项目,不包含Feature Pack。 (我没有使用function包的原因是因为这个项目需要向后兼容Win2K,而这个包已经过时了。)
所以我正在寻找一些简单的正则expression式匹配。
我做了一些search,大部分我能find的东西都不能被包含到一个商业项目中(我的是),或者这个库本身对我的需求来说太重了(例如Boost.Regex)。
有什么build议么?
如果我是你,我会使用Boost 1.54而不是他们的库,只是他们的源代码。
安装完整的boost分发。 在你的项目中,通过全选来添加C ++文件
..\boost_1_54_0\libs\regex\src\*.*
中的文件,当然..\boost_1_54_0\libs\regex\src\*.*
添加标题路径。
因为正则表达式src只是代码,并且很好地符合你的项目设置,所以你的项目不依赖于他们的库。
这是您的代码大小非常小的脚印。 但是,您也可以复制大部分项目设置,以创建正则表达式源的独立lib / dll,然后将其包含在其他项目中。
随着提高,没有商业代码的许可问题,只要它没有与它分发(即使这样,你只是给予归属)。
我得告诉你,提升正则表达式是一个神话般的引擎。
编辑2:你的答案What libs do I need to include?
如果将正则表达式源添加到项目中,则为NONE。 没有库,因为所有的代码都成为可执行文件的一部分。
你所要做的就是告诉你的项目安装发行版的目录(见下文)。 您添加的源文件将包括它所需的HPP文件。 只是编译。
从我的代码看,它的脚印看起来像是2-300K,这不是那么糟糕。
boost正则表达式几乎是所有的模板类hpp文件,它非常适合C ++。
你可以从我的示例中看到,我非常广泛地使用迭代器,它的路要走。
我使用了很多正则表达式。 我把它们放在一个myconst.h/cpp
模型中,并在需要的地方包含。 我也使用一个名为RegexFormat( 网站 )的程序来管理它们。 格式化/压缩/扩展/调试并从/到C ++字符串来回转换。 很容易..只是检查,他们把价格降低到29块钱。 (我49岁了,哦)。
有更多的方法来使用boost正则表达式。
这是一个小使用示例。 我试图把它砍下来,没有亵渎的意思。
它仍然看起来很大(对不起)。
不要犹豫,问问你有没有更多的问题
Project Properties ------------------- Configuration Properties -> C/C++ -> General -> Additional Include Directories -> F:\Dev\boost_1_54_0 ( <-where you install the distribution ) ////////////////////////////////////////////// // ======== myconst.h ========== #pragma once #ifndef _myconst #define _myconst // #include <boost/regex.hpp> #include <string> #include <iostream> // ------------------------ using namespace std; using namespace stdext; using namespace boost; // --------------------------------------------- typedef std::string::const_iterator SITR; #define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_m #define MODx regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_m | regex_constants::mod_x #define MODs regex_constants::perl | boost::regex::no_mod_m | regex_constants::mod_s #define MODxs regex_constants::perl | boost::regex::no_mod_m | regex_constants::mod_s | regex_constants::mod_x #define MODm regex_constants::perl | boost::regex::no_mod_s #define MODxm regex_constants::perl | boost::regex::no_mod_s| regex_constants::mod_x #define MODsm regex_constants::perl | regex_constants::mod_s #define MODxsm regex_constants::perl | regex_constants::mod_s | regex_constants::mod_x // Common regexes extern boost::regex TextLine; extern boost::regex TRI_TextLineReplace; extern boost::regex TextLineReplace; extern boost::regex BlankLinesReplace; extern boost::regex StripBoundryWsp; #endif _myconst // End _myconst // ////////////////////////////////////////////// ////////////////////////////////////////////// // ======== myconst.cpp ========== #include "stdafx.h" #include "myconst.h" boost::regex TextLine ( " (?| ( [^\\r\\n]* ) \\r\\n | ( [^\\r\\n]+ ) \\z ) " , MODx); boost::regex TRI_TextLineReplace ( // with support to escape trigraph '??x' sequence " ( [\\\\\"] | \\?(?=\\?) | (?<=\\?)\\? ) " , MODx); boost::regex TextLineReplace ( // no support to escape trigraph '??x' sequence " ( [\\\\\"] ) " , MODx); boost::regex StripBoundryWsp ("\\A \\s*(?=\\S) (.+?) (?<=\\S)\\s* \\z", MODxs); boost::regex BlankLinesReplace ( " (?: " " (?> \\A [^\\S\\r\\n]* (?: \\z | (?=\\r\\n) ) ) " " | (?> (?<=\\r\\n) [^\\S\\r\\n]* (?: \\z | (?=\\r\\n) ) ) " " ) " , MODx); // ////////////////////////////////////////////// ////////////////////////////////////////////// // ======== myeditor.cpp ========== #include "stdafx.h" #include "myconst.h" #include "myeditor.h" #include "makecstrdlg.h" LRESULT MyEditor::OnMsgMakeCstring(WPARAM /*wp*/, LPARAM /*lp*/) { CMakeCstrDlg dlg; if (dlg.DoModal() == IDOK) { if ( dlg.m_bType2 ) { CString mfcstr; GetWindowText( mfcstr ); string strSrc = mfcstr; GetMakeCstrType2( strSrc, dlg.bTrigraph ); SetWindowText( strSrc.c_str() ); } } SetFocus(); return 0; } void MyEditor::GetMakeCstrType2( string& strSrc, bool bTrigraph ) { if ( strSrc.length() == 0 ) { strSrc.assign("\"\""); // '""' return; } boost::regex Replacer; if ( bTrigraph ) Replacer = TRI_TextLineReplace; else Replacer = TextLineReplace; string strNewSrc = ""; string tmp; SITR _Mstart; SITR _Mend; boost::smatch _M; _Mstart = strSrc.begin(); _Mend = strSrc.end(); while ( boost::regex_search ( _Mstart, _Mend, _M, TextLine ) ) { tmp.assign( _M[1].first, _M[1].second ); tmp = boost::regex_replace ( tmp, Replacer, "\\\\$1" ); strNewSrc.append( "\"" + tmp ); strNewSrc.append( "\\n\"\r\n" ); _Mstart = _M[0].second; } strSrc = strNewSrc; } // //////////////////////////////////////////////
编辑:如果你使用boost正则表达式,下面会帮助你
预处理器:这些提升定义将运行良好
Boost Defines (in Project Settings) ================================= BOOST_ALL_NO_LIB BOOST_REGEX_NON_RECURSIVE BOOST_REGEX_BLOCKSIZE=32768 BOOST_REGEX_MAX_BLOCKS=8192 BOOST_REGEX_MAX_CACHE_BLOCKS=4096
这修复了一个恼人的警告,由于MS无法控制自己的头文件
================================================= #include <intsafe.h> #include <stdint.h> CAUSES THIS -> 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(72): warning C4005: 'INT8_MIN' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(144) : see previous definition of 'INT8_MIN' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(73): warning C4005: 'INT16_MIN' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(146) : see previous definition of 'INT16_MIN' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(74): warning C4005: 'INT32_MIN' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(148) : see previous definition of 'INT32_MIN' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(76): warning C4005: 'INT8_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(167) : see previous definition of 'INT8_MAX' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(77): warning C4005: 'INT16_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(171) : see previous definition of 'INT16_MAX' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(78): warning C4005: 'INT32_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(176) : see previous definition of 'INT32_MAX' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(79): warning C4005: 'UINT8_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(168) : see previous definition of 'UINT8_MAX' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(80): warning C4005: 'UINT16_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(173) : see previous definition of 'UINT16_MAX' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(81): warning C4005: 'UINT32_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(178) : see previous definition of 'UINT32_MAX' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(149): warning C4005: 'INT64_MIN' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(152) : see previous definition of 'INT64_MIN' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(150): warning C4005: 'INT64_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(184) : see previous definition of 'INT64_MAX' 1>f:\program files\microsoft visual studio 10.0\vc\include\stdint.h(151): warning C4005: 'UINT64_MAX' : macro redefinition 1> c:\program files\microsoft sdks\windows\v7.0a\include\intsafe.h(189) : see previous definition of 'UINT64_MAX' Fix 1 (preferred): ==================================================== In "\microsoft visual studio 10.0\vc\include\stdint.h" undefine them before they are re-defined #undef INT8_MIN #undef INT16_MIN #undef INT32_MIN #undef INT8_MAX #undef INT16_MAX #undef INT32_MAX #undef UINT8_MAX #undef UINT16_MAX #undef UINT32_MAX #undef INT64_MIN #undef INT64_MAX #undef UINT64_MAX Fix 2: ==================================================== In "\boost\config\compiler\visualc.hpp" undefine BOOST_HAS_STDINT_H //#if _MSC_VER >= 1600 #undef BOOST_HAS_STDINT_H //# define BOOST_HAS_STDINT_H //#endif
Boost是一个很好的答案,但是如果你以前从未使用过Boost,那么可能是一个较小的实现就足够了,可能会有较少的副作用。
Atl服务器 (在Codeplex上)在atlrx.h中也有一个正则表达式引擎,在MSDN中也有记录
你也可以在这里找到示例代码。
有一个旧的,但广泛使用的正则表达式库由亨利·斯宾塞编写,可能包含在数百个产品中。 以下是您可以得到它的许多地方之一: