मैं लॉग फ़ाइलों को पार्स करने के लिए std::regex_iterator
का उपयोग कर रहा हूं। मेरा कार्यक्रम कुछ हफ्तों के लिए काफी अच्छी तरह से काम कर रहा है और आज तक लाखों लॉग लाइनों को पार्स कर चुका है, जब आज मैंने इसे लॉग फ़ाइल के खिलाफ चलाया और एक स्टैक ओवरफ्लो प्राप्त किया। यह पता चला कि लॉग फ़ाइल में केवल एक लॉग लाइन समस्या पैदा कर रही थी। क्या किसी को पता है कि मेरा रेगेक्स इतनी भारी रिकर्सन क्यों कर रहा है? यहां एक छोटा सा निहित कार्यक्रम है जो इस मुद्दे को दिखाता है (मेरा कंपाइलर वीसी2012 है):std :: regex_iterator इस डेटा के साथ एक स्टैक ओवरफ़्लो क्यों करता है?
#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;
}
जटिल पैटर्न हिस्सा यह कारण हो रहा है। हालांकि क्यों नहीं पता। –
मुझे लगता है कि यह पर्ल में ठीक है, मुझे अभी तक 'std :: regex' पर भरोसा नहीं है। – Benj
@ बेंज वट? FUD। यह एक घातीय रूप से misbehaving regex हो सकता है। अक्सर यह घोंसला वाले क्लेन सितारों के बारे में है। गैर-लालची मैचों का उपयोग करने का प्रयास करें और जहां संभव हो '' 'के बजाय' + 'का उपयोग करें। बार-बार समूहों में विकल्प के साथ भी देखें। सबसे अच्छी सलाह ... छोटे से शुरू करें। चरण-दर-चरण बनाएं। प्रत्येक चरण में अपने regex का परीक्षण करें। – sehe