字符串"I am 5 years old"
正则表达式"(?!am )\d"
如果您转到http://regexr.com/并将正则表达式应用于字符串,则会得到5。
我想用std::regex得到这个结果,但是我不明白如何使用匹配结果,可能正则表达式也必须改变。

std::regex expression("(?!am )\\d");
std::smatch match;
std::string what("I am 5 years old.");
if (regex_search(what, match, expression))
{
     //???
}

最佳答案

std::smatchmatch_results类模板的实例化,用于在字符串对象上进行匹配(使用string::const_iterator作为其迭代器类型)。此类的成员是针对match_results所描述的成员,但使用string::const_iterator作为其BidirectionalIterator模板参数。
std::match_results 支持operator[]:

在您的情况下,regex_search仅找到第一个匹配项,然后match[0]保留整个匹配文本,match[1]将包含第一个捕获组(第一个括号模式部分)捕获的文本,依此类推。在这种情况下,您的正则表达式不包含捕获团体。
在此,您需要在此处使用捕获机制,因为std::regex不支持向后查找。您使用了一个先行检查来检查紧随当前位置之后的文本,而您所拥有的正则表达式并未按照您的预期进行。
因此,使用following code:

#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等)。

07-24 09:46
查看更多