Tôi đã sử dụng std::regex_iterator
để phân tích các tệp nhật ký. Chương trình của tôi đã hoạt động khá tốt trong vài tuần và đã phân tích cú pháp hàng triệu dòng đăng nhập, cho đến hôm nay, khi hôm nay tôi chạy nó đối với tệp nhật ký và bị tràn ngăn xếp. Hóa ra rằng chỉ một dòng đăng nhập trong tệp nhật ký đã gây ra sự cố. Có ai biết tại sao regex của tôi đang gây ra sự đệ quy khổng lồ như vậy? Đây là một chương trình tự chứa nhỏ hiển thị vấn đề (trình biên dịch của tôi là VC2012):Tại sao std :: regex_iterator gây ra tràn ngăn xếp với dữ liệu này?
#include <string>
#include <regex>
#include <iostream>
using namespace std;
std::wstring test = L"L3 T15356 79726859 [CreateRegistryAction] Creating REGISTRY Action:\n"
L" Identity: 272A4FE2-A7EE-49B7-ABAF-7C57BEA0E081\n"
L" Description: Set Registry Value: \"SortOrder\" in Key HKEY_CURRENT_USER\\Software\\Hummingbird\\PowerDOCS\\Core\\Plugins\\Fusion\\Settings\\DetailColumns\\LONEDOCS1\\Search Unsaved\\$AUTHOR.FULL_NAME;DOCSADM.PEOPLE.SYSTEM_ID\n"
L" Operation: 3\n"
L" Hive: HKEY_CURRENT_USER\n"
L" Key: Software\\Hummingbird\\PowerDOCS\\Core\\Plugins\\Fusion\\Settings\\DetailColumns\\LONEDOCS1\\Search Unsaved\\$AUTHOR.FULL_NAME;DOCSADM.PEOPLE.SYSTEM_ID\n"
L" ValueName: SortOrder\n"
L" ValueType: REG_DWORD\n"
L" ValueData: 0\n"
L"L4 T15356 79726859 [CEMRegistryValueAction::ClearRevertData] [ENTER]\n";
int wmain(int argc, wchar_t* argv[])
{
static wregex rgx_log_lines(
L"^L(\\d+)\\s+" // Level
L"T(\\d+)\\s+" // TID
L"(\\d+)\\s+" // Timestamp
L"\\[((?:\\w|\\:)+)\\]" // Function name
L"((?:" // Complex pattern
L"(?!" // Stop matching when...
L"^L\\d" // New log statement at the beginning of a line
L")"
L"[^]" // Matching all until then
L")*)" //
);
try
{
for (std::wsregex_iterator it(test.begin(), test.end(), rgx_log_lines), end; it != end; ++it)
{
wcout << (*it)[1] << endl;
wcout << (*it)[2] << endl;
wcout << (*it)[3] << endl;
wcout << (*it)[4] << endl;
wcout << (*it)[5] << endl;
}
}
catch (std::exception& e)
{
cout << e.what() << endl;
}
return 0;
}
Phần mẫu phức tạp dường như đang gây ra. Không biết tại sao mặc dù. –
Tôi đặt cược nó là tốt trong perl, tôi không hoàn toàn tin tưởng 'std :: regex' được nêu ra. – Benj
@Benj Wut? FUD. Nó có thể là một regex sai theo cấp số nhân. Thông thường nó là về các ngôi sao lồng nhau. Hãy thử sử dụng các kết quả không tham lam và hoặc sử dụng '+' thay vì '*' nếu có thể. Cũng xem ra với các tùy chọn trong các nhóm lặp đi lặp lại. Lời khuyên tốt nhất ... Bắt đầu nhỏ. Xây dựng từng bước. Kiểm tra regex của bạn từng bước. – sehe