我试图编写一个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,因为那时我会有更多的控制流语句(我不想要)。
答案 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将在引导程序中。然后您可以进一步检查。