C++11 regex_search和ECMAScript语法出现问题

Issue with C++11 regex_search and ECMAScript syntax

本文关键字:语法 问题 ECMAScript regex search C++11      更新时间:2023-10-16

我目前在Ubuntu下使用gcc-4.9,试验C++11库。regex的(默认)ECMAScript语法显然有一些我不理解的地方。

我的代码如下:

#include <iostream>
#include <exception>
#include <regex>
using namespace std;
int main() {
string test_str = "this is text containing teeext! Text! Teeeeeeeeeext! This txt should not be matched, nor this Txt";
string pattern = "([Tt][e]+xt)";
try {
    regex r(pattern, regex_constants::ECMAScript);
    smatch results;
    if (regex_search(test_str, results, r))
    {
        cout << "Found #" << results.size() << " results!" << endl;
        for(unsigned int i = 0; i < results.size(); i++)
        {
                cout << results[i].str() << endl;
        }
    }
    else
        cout << "no match for " << pattern << endl;
} catch (regex_error &e) {
    cout << "what: " << e.what() << "; code: " << e.code() << endl;
}
}

我希望正则表达式匹配原始字符串中的"text"、"teeext"、"text"answers"Teeeeeeext";但是输出是:

Found #2 results!
text
text

我已经尝试了几种方法来指定正则表达式,例如"[T|t]e+xt"和变体,但似乎都不起作用。我做错了什么?

谢谢你抽出时间。

您误解了size()[]match_results对象的作用。regex_searchregex_match不尽可能多次地应用正则表达式。他们寻找第一个匹配。match_results对象中的子匹配对应于正则表达式中的各个组(括号子表达式),索引0对应于整个匹配。

因此,在您的情况下,它在第一场比赛(text)时停止。该值由整个正则表达式匹配,(因为整个正则表达式是一个捕获组)也由第一个子组匹配。这就是为什么size()2,并且两个子表都返回text