符合数学表达式的正则态度
Regex to match mathematical expressions
我有一个正则我打算用来"令牌"数学表达式,例如:
a + b + 1 + 2
int main() {
string rxstrIdentifier = "\b[a-zA-Z]\w*\b";
string rxstrConstant = "\b\d+\b";
string rxstrRef = "(" + rxstrIdentifier + ")|(" + rxstrConstant + ")"; // identifier or constant
const regex rxExpr = regex("^(" + rxstrRef + ")(.*)$"); // {x} [{+} {y}]*
//const regex rxSubExpr = regex("^\s*([+])\s*(" + rxstrRef + ")(.*)$"); // {+} {x} [...]
string test = "b + a + 1";
cmatch res;
regex_search(test.c_str(), res, rxExpr);
cout << "operand: " << res[1] << endl;
cout << "res: " << res[2] << endl;
system("pause");
return 0;
}
问题是操作数,RES在示例中仅给出B。我期望
operand: b
res: + a + 1
曾经在另一个类似的正时正时工作...
const regex Parser::rxExpr = regex("^(\w+)((\s*([+])\s*(\w+))*)$"); // {x} [{+} {y}]*
const regex Parser::rxSubExpr = regex("^\s*([+])\s*(\w+)(.*)$"); // {+} {x} [...]
您的regexes似乎不允许字符串中的空格。 b
匹配字边界,但边界的宽度为零,因此没有什么可以消耗令牌之间的空间。
使用(?:模式)组:
string rxstrRef = "(?:" + rxstrIdentifier + ")|(?:" + rxstrConstant + ")"; // identifier or constant
这消除了对搜索结果的影响
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 即使使用调试编译标志,表达式也是"optimized out"
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 符合数学表达式的正则态度