首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表示数学表达式的C++11正则表达式

表示数学表达式的C++11正则表达式
EN

Stack Overflow用户
提问于 2014-07-13 16:46:54
回答 2查看 643关注 0票数 0

我有以下代码来标记格式的字符串:(1+2)/((8))-(100*34):

如果用户使用的运算符或字符不是我的正则表达式的一部分,我想向用户抛出一个错误。例如,如果用户输入3^4或x-6

有没有一种方法可以否定我的正则表达式,搜索它,如果它是真的,抛出错误?

正则表达式可以改进吗?

代码语言:javascript
复制
  //Using c++11 regex to tokenize input string
  //[0-9]+ = 1 or many digits
  //Or [\\-\\+\\\\\(\\)\\/\\*] = "-" or "+" or "/" or "*" or "(" or ")"
  std::regex e ( "[0-9]+|[\\-\\+\\\\\(\\)\\/\\*]");
  std::sregex_iterator rend;
  std::sregex_iterator a( infixExpression.begin(), infixExpression.end(), e );

  queue<string> infixQueue;
  while (a!=rend) {
      infixQueue.push(a->str());
      ++a;
  }
  return infixQueue;

-Thanks

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-13 17:02:07

您可以使用搜索表达式[^0-9()+\-*/]对字符串进行搜索,搜索表达式[^0-9()+\-*/]定义为C++字符串为"[^0-9()+\\-*/]",查找任何不是数字的字符、圆括号、正负号(实数连字符)、星号或斜杠。

带有此正则表达式搜索字符串的搜索不应返回任何内容,否则字符串包含不支持的字符,如^x

[.]是一个正字符类,意思是查找一个字符是方括号中的字符之一。

[^.]是一个负字符类,意思是查找一个字符不是方括号中的字符之一。

只有在方括号内转义才能解释为文字字符的字符是]\-,如果-是方括号内字符列表中的第一个或最后一个字符,则不能转义-。但是,最好将-转义到方括号中,因为这使得正则表达式引擎/函数更容易检测到连字符应该被解释为字面字符,而不是“从x到z”。

当然,这个表达式不会检查是否缺少结束圆括号。但是,与编译器或脚本解释器相比,公式解析器通常不要求每个开括号都有一个结束括号,只是因为不需要根据输入的公式计算值。

票数 1
EN

Stack Overflow用户

发布于 2019-05-19 02:19:09

答案已经给出了,但也许有人需要这个

代码语言:javascript
复制
[0-9]?([0-9]*[.])?[0-9]+|[\\-\\+\\\\\(\\)\\/\\*]

这个正则表达式分离浮点数、整数和算术运算符。

这里的诀窍是:0-9?(0-9*)?0-9+ ->,如果它是一个数字,并且有一个点,那么就抓取带有点的数字和后面的数字,如果不是,只需要抓取数字。

对不起,如果我的答案不清楚,我只是学习了regex,并找到了我自己的解决方案,只是尝试和错误。

下面是代码(它接受一个数学表达式并将所有数字和运算符拆分成一个向量)

注意:我不知道它是否接受空格,这意味着我所用的数学表达式没有空格。示例: 4+2*(3+1),可以很好地将所有的东西分开,但是我没有尝试过使用空白空间。

代码语言:javascript
复制
/* Separate every int or float or operator into a single string using regular expression and store it in untokenize vector */

    string infix; //The string to be parse (the arithmetic operation if you will)
    vector<string> untokenize;
    std::regex words_regex("[0-9]?([0-9]*[.])?[0-9]+|[\\-\\+\\\\\(\\)\\/\\*]"); 
    auto words_begin = std::sregex_iterator(infix.begin(), infix.end(), words_regex);
    auto words_end = std::sregex_iterator();

    for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
        cout << (*i).str() << endl;
        untokenize.push_back((*i).str());
    }

输出:

代码语言:javascript
复制
(<br/>
1<br/>
+<br/>
2<br/>
)<br/>
/<br/>
(<br/>
(<br/>
8<br/>
)<br/>
)<br/>
-<br/>
(<br/>
100<br/>
*<br/>
34<br/>
)<br/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24725000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档