在没有正则表达式的情况下拾取特定的字符串模式
Picking up a certain string pattern without regex
我有一个场景,我有各种带有特定宏的c++文件:
__EXTERNALIZE(Name, File)
这个宏是空的,它不做任何事情。但是我想编写一个外部工具来扫描这个宏的一个或多个输入文件,并在发现后执行一些操作。
为了澄清,这里有一点伪c:
typedef struct {
char* varname;
char* filename;
} MacroInfo_s;
FILE* fh = fopen("./source.cpp",'r');
while(read_untill_macro(fh) && !feof(fh)) {
MacroInfo_s m;
fill_macro_info(&m, fh);
// Do something with m.varname and m.filename
}
c++ 11没有广泛使用。例如,VS 2010根本不提供它,这是我在Windows方面想要达到的最低目标。在我的OS X 10.10上,一切都很好。这也是我主要不想使用Regexp的原因,因为我需要一个额外的库。而仅仅对几个文件中的单个宏作出反应似乎有点过头了。
有什么好方法可以使它工作?
我能想到的最简单的方法是使用std::getline读取每个打开父级(
,然后为宏检查该字符串。
然后另一个std::getline读取到结束父括号)
应该提取你的宏的参数。
像这样:
const std::string EXTERNALIZE = "__EXTERNALIZE";
int main(int, char* argv[])
{
for(char** arg = argv + 1; *arg; ++arg)
{
std::cout << "Processing file: " << *arg << 'n';
std::ifstream ifs(*arg);
std::string text;
while(std::getline(ifs, text, '('))
{
// use rfind() to check the text leading up to the open paren (
if(text.rfind(EXTERNALIZE) != text.size() - EXTERNALIZE.size())
continue;
std::cout << "found macro:" << 'n';
// now read the parameters up to the closing paren )
std::getline(ifs, text, ')');
// here are the macro's parameters
std::cout << "parameters: " << text << 'n';
}
}
}
相关文章:
- 小字符串优化(调试与发布模式)
- C++ 中用于搜索字符串模式的正则表达式
- C 搜索模式在2个字符串中,而无需串联
- 如何提取由特定模式分开的JSON对象字符串
- AES/CFB密码模式从字符串失败中解密
- 正则表达式:从模式字符串 1.string2'string3 中提取字符串,其中字符串 1 可以包含 '." 字符
- 在匹配另一个模式的字符串中找到最短子字符串的开始和结尾索引
- 如何将正则表达式模式存储为正则表达式对象或字符串
- 用于多个级联字符串的同步模式匹配算法
- 如何在C++中有效地提取字符串模式
- 使用后缀数组和 LCP(-LR) 实现字符串模式匹配
- 基于匹配字符串模式来简化函数
- 与缓冲区数据匹配的 C++ 字符串模式
- 在给定字符串中查找字符串模式的重复
- 如何使用标准库(包括boost)实现简单的字符串模式匹配
- QRegExp找不到预期的字符串模式
- 字符串模式匹配和插入
- 寻找字符串模式的更好解决方案
- 如果字符位于引号之间,则不匹配(AKA具有编程字符串模式)
- 在没有正则表达式的情况下拾取特定的字符串模式