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 đươngMat.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ậpMat[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