Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

match_results::operator[] trong C++ STL

std::match_results::operator[] (header <regex>) cung cấp truy cập trực tiếp đến sub-match (capture group) thứ n trong kết quả khớp regex.

Cú pháp

const_reference operator[](size_type n) const;
  • n = 0: Toàn bộ match (group 0).
  • n = 1, 2, ...: Các capturing group theo thứ tự ngoặc mở trong regex.
  • Nếu n >= size() hoặc match không thành công → hành vi không xác định (trả về sub_match rỗng).

Ví dụ 1: Truy cập các group

#include <bits/stdc++.h>
using namespace std;

int main() {
    string str = "TutorialsPoint";
    regex R("(Tutorials)(.*)"); // 2 groups
    
    smatch Mat;
    regex_match(str, Mat, R);
    
    for (size_t i = 0; i < Mat.size(); ++i) {
        cout << "Mat[" << i << "] = '" << Mat[i] << "'\n";
    }
    return 0;
}

Đầu ra

Mat[0] = 'TutorialsPoint'
Mat[1] = 'Tutorials'
Mat[2] = 'Point'

Ví dụ 2: Tìm group dài nhất

#include <bits/stdc++.h>
using namespace std;

int main() {
    string str = "Tutorials Point";
    regex R("(Tutorials)(Point)(.*)"); // 3 groups
    
    smatch Mat;
    regex_match(str, Mat, R);
    
    size_t max_len = 0;
    string longest;
    
    for (size_t i = 1; i < Mat.size(); ++i) { // Bỏ qua group 0
        if (Mat.length(i) > max_len) {
            max_len = Mat.length(i);
            longest = Mat[i].str(); // hoặc Mat[i]
        }
    }
    
    cout << "Group dài nhất: '" << longest << "' (độ dài " << max_len << ")\n";
    return 0;
}

Đầu ra

Group dài nhất: 'Tutorials' (độ dài 9)

Kiểu trả về: sub_match

Mat[i] trả về sub_match<iterator>, có thể:

  • Ép ngầm sang string: string s = Mat[i];
  • Gọi .str(): Mat[i].str().
  • So sánh với string: Mat[i] == "abc".
  • Xuất stream: cout << Mat[i].
  • Lấy độ dài: Mat[i].length() (tương đương Mat.length(i)).

Lưu ý

  • Chỉ đọc (const reference), không thể gán Mat[i] = "new".
  • Luôn kiểm tra i < Mat.size() trước khi truy cập.
  • Với regex_search, nếu không khớp, Mat.size() == 0, truy cập Mat[0] không an toàn.

So sánh với str(n)

Mat[i].str()  // Tương đương Mat.str(i)
Mat[i]        // sub_match object, convertible to string