regex_match给出意想不到的结果
regex_match giving unexpected results
我正在尝试编写一个递归下降解析器,并试图在用户输入的字符串中搜索匹配的正则表达式。我正在尝试执行以下操作以尝试了解 C++11 提供的<regex>
库,但我得到了意想不到的结果。
std::string expression = "2+2+2";
std::regex re("[-+*/()]");
std::smatch m;
std::cout << "My expression is " << expression << std::endl;
if(std::regex_search(expression, re)) {
std::cout << "Found a match!" << std::endl;
}
std::regex_match(expression, m, re);
std::cout << "matches:" << std::endl;
for (auto it = m.begin(); it!=m.end(); ++it) {
std::cout << *it << std::endl;
}
所以根据我的正则表达式,我希望它输出
Found a match!
matches:
+
+
但是,我得到的输出是:
My expression is 2+2+2
Found a match!
matches:
我觉得我犯了一个愚蠢的错误,但我似乎无法弄清楚为什么输出之间存在差异。
谢谢埃里普
你有几个问题。首先,让我们看一些工作代码:
#include <regex>
#include <iostream>
int main() {
std::string expr = "2+2+2";
std::regex re("[+\-*/()]");
const auto operators_begin = std::sregex_iterator(expr.begin(), expr.end(), re);
const auto operators_end = std::sregex_iterator();
std::cout << "Count: " << std::distance(operators_begin, operators_end) << "n";
for (auto i = operators_begin; i != operators_end; ++i) {
std::smatch match = *i;
std::cout << match.str() << "n";
}
}
输出:
Count: 2
+
+
代码问题:
-
regex_match()
返回假。 - 正则表达式中没有任何捕获组。因此,即使
regex_match()
返回为真,它也不会捕获任何内容。 regex_match
中的捕获次数可以通过查看正则表达式严格确定。所以我的re将只捕获一组。- 但是我们希望在字符串上多次应用此正则表达式,因为我们想找到所有匹配项。该工具是
regex_iterator
. - 我们还需要转义正则表达式中的
-
。减号在字符类中具有特殊含义。
我找到了regex_iterator
,它解决了这个问题。这是工作代码:
std::regex re("[-+*/()]");
std::smatch m;
std::cout << "My expression is " << expression << std::endl;
if(std::regex_search(expression, re)) {
std::cout << "Found a match!" << std::endl;
}
try {
std::sregex_iterator next(expression.begin(), expression.end(), re);
std::sregex_iterator end;
while (next != end) {
std::smatch match = *next;
std::cout << match.str() << "n";
next++;
}
} catch (std::regex_error& e) {
// Syntax error in the regular expression
}
相关文章:
- 为什么在递归中使用循环会产生意想不到的结果?
- 字符到int8_t转换会产生意想不到的结果?
- libc++ 对 std::map/set::equal_range 的实现给出了意想不到的结果
- 微小加密算法实现会产生意想不到的结果
- 使用 std::set 的 .begin() 和 .end() 函数会产生意想不到的结果
- 在我的C++链表实现中取消引用节点指针,给出意想不到的结果
- C++正则表达式Visual Studio Community 2015给出<regex>意想不到的结果
- istringstream int8_t产生意想不到的结果
- 划分 OpenCV 垫会产生意想不到的结果
- 提升精神,提升任何意想不到的结果
- regex_match给出意想不到的结果
- 从 PASCAL 到 C++ 的代码转换给出了意想不到的结果
- 意想不到的结果c++
- 在lambda上使用条件运算符调用std::any_of会得到意想不到的结果
- vector::insert在VS2010中执行意想不到的结果
- list resize会产生意想不到的结果
- CUDA: 2D数组索引产生意想不到的结果
- 将字符串转换为整数会产生意想不到的结果
- 在c++中,一些宏语句可能会产生意想不到的结果
- Visual Studio可变宏展开会产生意想不到的结果