在没有正则表达式的情况下拾取特定的字符串模式

Picking up a certain string pattern without regex

本文关键字:字符串 模式 情况下 正则表达式      更新时间:2023-10-16

我有一个场景,我有各种带有特定宏的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';
        }
    }
}