C++ regex lexer-名称和编号相互识别

C++ regex lexer-名称和编号相互识别,c++,regex,lexer,C++,Regex,Lexer,我有这个正则表达式和符号的基本向量: std::vector<std::pair<std::string, std::string>> patterns = { {"\\+|\\\\|\\*|\\-|\\%|\\=", "OPERATOR"}, {"[0-9]+", "NUMBER"}, {"[a-zA-z_][a-zA-Z0-9_]*", "NAME"}, }; 问题是a45是一个名字,但45是名字的一部分,但它也是一个数字,但我不希望它被识

我有这个正则表达式和符号的基本向量:

std::vector<std::pair<std::string, std::string>> patterns = 
{
    {"\\+|\\\\|\\*|\\-|\\%|\\=", "OPERATOR"},
    {"[0-9]+", "NUMBER"},
    {"[a-zA-z_][a-zA-Z0-9_]*", "NAME"},
};
问题是a45是一个名字,但45是名字的一部分,但它也是一个数字,但我不希望它被识别为数字。
我不知道如何克服这种问题…

对于非重叠匹配,为了更好的性能,您应该组合正则表达式,然后检查匹配的部分

"(\\+|\\\\|\\*|\\-|\\%|\\=)|([0-9]+)|([a-zA-z_][a-zA-Z0-9_]*)"

 ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
           group 1          group 2         group 3
如果捕获组1匹配,则下一个“令牌”是操作员。
如果捕获组2匹配,则下一个“令牌”是一个数字。
如果捕获组3匹配,则下一个“标记”是名称

a45 NAME
45 NUMBER
= OPERATOR
77 NUMBER
"(\\+|\\\\|\\*|\\-|\\%|\\=)|([0-9]+)|([a-zA-z_][a-zA-Z0-9_]*)"

 ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
           group 1          group 2         group 3