`
feipigwang
  • 浏览: 775340 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

regex_test.cpp -- learning boost.regex

阅读更多
boost.regex 库的用法,看来这可能是 boost 当中写法最“常规”的库之一了。

regex_test.cpp:

#include <string>
#include <map>
#include <fstream>
#include <iostream>
#include <boost/regex.hpp>

using namespace std;

// purpose:
// takes the contents of a file in the form of a string
// and searches for all the C++ class definitions, storing
// their locations in a map of strings/int's

typedef map<string, string::difference_type, less<string> > map_type;

const char* re =
// possibly leading whitespace:
"^[[:space:]]*"
// possible template declaration:
"(template[[:space:]]*<[^;:{]+>[[:space:]]*)?"
// class or struct:
"(class|struct)[[:space:]]*"
// leading declspec macros etc:
"("
"\\<\\w+\\>"
"("
"[[:blank:]]*\\([^)]*\\)"
")?"
"[[:space:]]*"
")*"
// the class name
"(\\<\\w*\\>)[[:space:]]*"
// template specialisation parameters
"(<[^;:{]+>)?[[:space:]]*"
// terminate in { or :
"(\\{|:[^;\\{()]*\\{)";

boost::regex expression(re);
map_type class_index;

bool regex_callback(const boost::match_results<string::const_iterator>& what)
{
// what[0] contains the whole string
// what[5] contains the class name.
// what[6] contains the template specialisation if any.
// add class name and position to map:
class_index[what[5].str() + what[6].str()] = what.position(5);
return true;
}

void load_file(string& s, istream& is)
{
s.erase();
s.reserve(is.rdbuf()->in_avail());
cout << s.capacity();
char c;
while(is.get(c))
{
if(s.capacity() == s.size())
s.reserve(s.capacity() * 3);
s.append(1, c);
}
}

int main(int argc, const char** argv)
{
string text;
for(int i = 1; i < argc; ++i)
{
cout << "Processing file " << argv[i] << endl;
ifstream fs(argv[i]);
load_file(text, fs);
// construct our iterators:
boost::sregex_iterator m1(text.begin(), text.end(), expression);
boost::sregex_iterator m2;
for_each(m1, m2, &regex_callback);
// copy results:
cout << class_index.size() << " matches found" << endl;
map_type::iterator c, d;
c = class_index.begin();
d = class_index.end();
while(c != d)
{
cout << "class \"" << (*c).first << "\" found at index: " << (*c).second << endl;
++c;
}
class_index.erase(class_index.begin(), class_index.end());
}

return 0;
}

//========== For Test =============
class Person
{};

template <class T>
class Temp
{
};

template <>
class Temp<string>
{
};

=================================================================================
cl /EHsc regex_test.cpp

regex_test regex_test.cpp

OUTPUT:

Processing file regex_test.cpp
153 matches found
class "Person" found at index: 2331
class "Temp" found at index: 2368
class "Temp<string>" found at index: 2397

分享到:
评论

相关推荐

    libboost_regex-vc90-mt-s-1_53.lib

    《深入理解libboost_regex-vc90-mt-s-1_53.lib:Boost库的正则表达式实现与应用》 在IT行业中,Boost库是C++开发者不可或缺的工具之一,它为C++标准库提供了许多扩展和增强功能。其中,`libboost_regex-vc90-mt-s-1...

    Python库 | regex-2020.1.7-cp36-cp36m-manylinux1_x86_64.whl

    资源分类:Python库 所属语言:Python 资源全名:regex-2020.1.7-cp36-cp36m-manylinux1_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    boost_regex-vc80-mt-1_34.lib

    自己编译了一个库,供大家分享,下载,使用

    regex-2022.6.2-cp39-cp39-win_amd64.whl.zip

    标题 "regex-2022.6.2-cp39-cp39-win_amd64.whl.zip" 暗示了这是一个与正则表达式(regex)相关的Python库的更新版本,用于Windows平台的AMD64架构。描述中的内容与标题相同,进一步确认了这是针对Python 3.9版本的...

    Python库 | regex-2021.7.1-cp38-cp38-manylinux2014_x86_64.whl

    python库。资源全名:regex-2021.7.1-cp38-cp38-manylinux2014_x86_64.whl

    regex-2022.6.2-cp311-cp311-win_amd64.whl.zip

    标题中的"regex-2022.6.2-cp311-cp311-win_amd64.whl.zip"是一个Python软件包的压缩文件,它包含了Python的正则表达式库regex的特定版本。这个版本是2022年6月2日发布的,适用于Python 3.11解释器,并且是为Windows ...

    regex_test.rar_ARGUMENT!

    标题中的"regex_test.rar_ARGUMENT!"提及了正则表达式(regex_test)和命令行参数(argument)。这可能是指一个包含正则表达式测试程序的压缩文件,其中可能用于演示或验证不同正则表达式模式的功能,同时可能需要...

    Python库 | regex-2021.10.21-cp38-cp38-win_amd64.whl

    资源分类:Python库 所属语言:Python 资源全名:regex-2021.10.21-cp38-cp38-win_amd64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    regex-2021.8.3-cp39-cp39-win_amd64

    regex-2021.8.3-cp39-cp39-win_amd64

    matlab所依赖的boost_*****.dll文件文件打包.zip

    本压缩包提供的是一系列与Boost库相关的DLL文件,如libmwmcos_boost_graph.dll、boost_regex-vc120-mt-1_56.dll等,这些都是MATLAB在运行特定功能时需要调用的组件。具体来说: 1. libmwmcos_boost_graph.dll:这...

    boost_1_59_0.tar.gz

    3. **正则表达式库(Boost.Regex)**:提供了比标准库更强大的正则表达式处理能力。 4. **日期时间库(Boost.DateTime)**:支持日期、时间和持续时间的处理,包括国际化和本地化功能。 5. **文件系统库(Boost....

    regex-2021.8.3-cp37-cp37m-win_amd64

    regex-2021.8.3-cp37-cp37m-win_amd64

    db2-正则表达式.zip

    1- Save attached db2_regex.zip file to a new folder on the hard disk for example to C:\avalanche 2- Extract all files from the zip file to C:\avalanche\db2_regex 3- Open C:\avalanche\db2_regex\...

    PyPI 官网下载 | regex-2020.5.14-cp37-cp37m-manylinux1_x86_64.whl

    标题中的"PyPI 官网下载 | regex-2020.5.14-cp37-cp37m-manylinux1_x86_64.whl"指的是Python的包索引(Python Package Index)上提供的一个名为`regex`的Python库的特定版本。PyPI是Python开发者发布和分享他们编写...

    boost_regex-vc6-1_37

    "boost_regex-vc6-1_37"是Boost库的一个版本,专为Visual C++ 6.0(简称VC6)编译器设计,版本号为1.37。这篇文将深入探讨Boost.Regex库在VC6环境下的使用方法和重要特性。 首先,让我们了解Boost.Regex库的核心...

    Python库 | regex-2020.10.15-cp38-cp38-manylinux2010_x86_64.whl

    python库。资源全名:regex-2020.10.15-cp38-cp38-manylinux2010_x86_64.whl

    PyPI 官网下载 | regex-2021.9.24-cp38-cp38-macosx_10_9_x86_64.whl

    资源来自pypi官网。 资源全名:regex-2021.9.24-cp38-cp38-macosx_10_9_x86_64.whl

    Regex_Test.zip_C#的Regex

    这个名为"Regex_Test.zip"的压缩包包含两个子文件,分别针对C# 2002和2005版本的Windows应用程序示例,即"WindowsApplication1(c# 2005).zip"和"WindowsApplication5(c# 2002).zip"。这两个程序可能演示了如何在C#...

    regex-2022.3.15-cp37-cp37m-win_amd64.whl.zip

    标题 "regex-2022.3.15-cp37-cp37m-win_amd64.whl.zip" 提供的信息显示,这是一个与正则表达式(regex)相关的软件包,版本号为2022.3.15,适配Python 3.7(cp37表示Python 3.7),且是针对Windows AMD64架构的。...

Global site tag (gtag.js) - Google Analytics