首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在std::smatch中返回了什么,你应该如何使用它?

在std::smatch中返回了什么,你应该如何使用它?
EN

Stack Overflow用户
提问于 2017-06-14 17:27:07
回答 1查看 12.1K关注 0票数 17

string "I am 5 years old"

正则表达式"(?!am )\d"

如果你转到http://regexr.com/并将正则表达式应用于字符串,你会得到5。我希望通过std::regex得到这个结果,但我不知道如何使用匹配结果,可能正则表达式也必须更改。

代码语言:javascript
复制
std::regex expression("(?!am )\\d");
std::smatch match;
std::string what("I am 5 years old.");
if (regex_search(what, match, expression))
{
     //???
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-14 17:39:19

std::smatchmatch_results类模板的实例化,用于匹配string对象(使用string::const_iterator作为迭代器类型)。此类的成员是为match_results描述的成员,但使用string::const_iterator作为其BidirectionalIterator模板参数。

std::match_results支持operator[]

如果为n > 0n < size(),则返回对std::sub_match的引用,该引用表示与_n_th捕获的marked subexpression匹配的目标序列的一部分。

如果为n == 0,则返回对std::sub_match的引用,该the表示与整个匹配的正则表达式匹配的目标序列部分。

如果为n >= size(),则返回对表示不匹配子表达式(目标序列的空子范围)的std::sub_match的引用。

在您的示例中,regex_search只查找第一个匹配项,然后match[0]保存整个匹配文本,match[1]将包含使用第一个捕获组(第一个带括号的模式部分)捕获的文本,依此类推。

在这里,您需要使用捕获机制,因为std::regex不支持后视。您使用了一个先行检查紧跟在当前位置后面的文本,而您拥有的正则表达式并没有像您认为的那样工作。

因此,使用following code

代码语言:javascript
复制
#include <regex>
#include <string>
#include <iostream>
using namespace std;

int main() {
    std::regex expression(R"(am\s+(\d+))");
    std::smatch match;
    std::string what("I am 5 years old.");
    if (regex_search(what, match, expression))
    {
         cout << match.str(1) << endl;
    }
    return 0;
}

这里的模式是am\s+(\d+)"。它匹配am、1+空格,然后使用(\d+)捕获1个或多个数字。在代码内部,match.str(1)允许访问通过捕获组捕获的值。由于模式中只有一个(...),即一个捕获组,其ID为1。因此,str(1)将捕获的文本返回到此组中。

原始字符串文字(R"(...)")允许使用单个反斜杠进行正则表达式转义(如\d\s等)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44540711

复制
相关文章

相似问题

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