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