正则表达式挂起我的程序

时间:2016-11-20 02:31:23

标签: c++ regex

我试图编写一个c ++正则表达式,基本上将一些符号和标识符作为标记化程序的一部分进行匹配。目前,我有这个:

EDITED

  regex tokens("([a-zA-Z_][a-zA-Z0-9_]*)|(\\S?)|(\\S)")

  vector<string> identifiers(std::sregex_token_iterator(str.begin(), str.end(),
      IDENTIFIER),std::sregex_token_iterator());

https://regex101.com/r/mFTC1Y/2

问题是,它挂起了我的程序(只需要永远,我永远不会参加比赛)。我不明白这是怎么回事?我正在使用的正则表达式测试仪表示需要大约7毫秒来匹配...

请帮忙!

JUST EDITED:所以这个正则表达式匹配我想要的,但只能通过组捕获。如果它解析:

main() 

它会返回

main(    // full match
main     // group 1
(        // group 2

新比赛

)        // full match
)        // group 3

我只是想要小组赛,而不必明确检查各自的小组(即我只是不向我回复完整的比赛)。如何更新我的代码呢?

修改 所以,这是完整的,有效的代码。我更喜欢它更优雅。

        regex TOKENS("([a-zA-Z_][a-zA-Z0-9_]*)|(\\S?)|(\\S)")

        auto identifier = sregex_iterator(str.cbegin(), str.cend(), TOKENS);
        auto it = sregex_iterator();

        for_each(identifier, it, [&](smatch const& m){

            string group1(m[1].str());
            string group2(m[2].str());
            string group3(m[3].str());

            if(isKeyword(keywords, group1))     cout << "<keyword> "    << group1 << " </keyword>"      << endl;
            else if(group1 != "")               cout << "<identifier> " << group1 << " </identifier>"   << endl;
            if (isSymbol(symbols, group2))      cout << "<symbol> "     << group2 << " </symbol>"       << endl;
            if (isSymbol(symbols, group3))      cout << "<symbol> "     << group3 << " </symbol>"       << endl;
});

更优雅的东西可能是以非常复杂的正则表达式为代价的,或者是非常聪明的正则表达式,因为我本来要做的就是将代码标记为三种类型之一:KEYWORD,ID和SYMBOL - 所有一个正则表达式。接下来我将不得不处理INT / STRING const和注释。我试图避免的是用char标记char,因为那时我会有更多的控制流语句(我不想要)。

1 个答案:

答案 0 :(得分:0)

我不确定您的正则表达式是否正确。

请尝试以下操作:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <regex>

// Our test data (raw string). So, containing also \n and so on
std::string testData(
R"#( :-)  IDcorrect1 _wrongID I2DCorrect
    3FALSE lowercasecorrect Underscore_not_allowed
i3DCorrect,i4 :-)
}
)#");

std::regex re("(\\b[a-zA-Z][a-zA-Z0-9]*\\b)");

int main(void)
{
    // Define the variable id as vector of string and use the range constructor to read the test data and tokenize it
    std::vector<std::string> id{ std::sregex_token_iterator(testData.begin(), testData.end(), re, 1), std::sregex_token_iterator() };

    // For debug output. Print complete vector to std::cout
    std::copy(id.begin(), id.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}

所有ID将在引导程序中。然后您可以进一步检查。