我有以下代码来标记格式的字符串:(1+2)/((8))-(100*34):
如果用户使用的运算符或字符不是我的正则表达式的一部分,我想向用户抛出一个错误。例如,如果用户输入3^4或x-6
有没有一种方法可以否定我的正则表达式,搜索它,如果它是真的,抛出错误?
正则表达式可以改进吗?
//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
发布于 2014-07-13 17:02:07
您可以使用搜索表达式[^0-9()+\-*/]对字符串进行搜索,搜索表达式[^0-9()+\-*/]定义为C++字符串为"[^0-9()+\\-*/]",查找任何不是数字的字符、圆括号、正负号(实数连字符)、星号或斜杠。
带有此正则表达式搜索字符串的搜索不应返回任何内容,否则字符串包含不支持的字符,如^或x。
[.]是一个正字符类,意思是查找一个字符是方括号中的字符之一。
[^.]是一个负字符类,意思是查找一个字符不是方括号中的字符之一。
只有在方括号内转义才能解释为文字字符的字符是]、\和-,如果-是方括号内字符列表中的第一个或最后一个字符,则不能转义-。但是,最好将-转义到方括号中,因为这使得正则表达式引擎/函数更容易检测到连字符应该被解释为字面字符,而不是“从x到z”。
当然,这个表达式不会检查是否缺少结束圆括号。但是,与编译器或脚本解释器相比,公式解析器通常不要求每个开括号都有一个结束括号,只是因为不需要根据输入的公式计算值。
发布于 2019-05-19 02:19:09
答案已经给出了,但也许有人需要这个
[0-9]?([0-9]*[.])?[0-9]+|[\\-\\+\\\\\(\\)\\/\\*]这个正则表达式分离浮点数、整数和算术运算符。
这里的诀窍是:0-9?(0-9*)?0-9+ ->,如果它是一个数字,并且有一个点,那么就抓取带有点的数字和后面的数字,如果不是,只需要抓取数字。
对不起,如果我的答案不清楚,我只是学习了regex,并找到了我自己的解决方案,只是尝试和错误。
下面是代码(它接受一个数学表达式并将所有数字和运算符拆分成一个向量)
注意:我不知道它是否接受空格,这意味着我所用的数学表达式没有空格。示例: 4+2*(3+1),可以很好地将所有的东西分开,但是我没有尝试过使用空白空间。
/* 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());
}输出:
(<br/>
1<br/>
+<br/>
2<br/>
)<br/>
/<br/>
(<br/>
(<br/>
8<br/>
)<br/>
)<br/>
-<br/>
(<br/>
100<br/>
*<br/>
34<br/>
)<br/>https://stackoverflow.com/questions/24725000
复制相似问题