C++ में रेगुलर एक्सप्रेशन: उदाहरण सहित व्यावहारिक गाइड
\n\nरेगुलर एक्सप्रेशन (regex) टेक्स्ट प्रोसेसिंग का एक शक्तिशाली टूल है, जो जटिल पैटर्न के आधार पर स्ट्रिंग्स को खोजने, बदलने और वैलिडेट करने में मदद करता है। C++ में रेगुलर एक्सप्रेशन का सपोर्ट C++11 स्टैंडर्ड से <regex> लाइब्रेरी के ज़रिए आया। इस आर्टिकल में हम std::regex का प्रैक्टिकल उपयोग सीखेंगे: सिंपल चेक से लेकर डेटा एक्सट्रैक्शन और टेक्स्ट रिप्लेसमेंट तक।
यह सामग्री C++ के नए सीखने वालों और अनुभवी डेवलपर्स दोनों के लिए उपयोगी है। हम मुख्य फंक्शन्स std::regex_match, std::regex_search और std::regex_replace के साथ-साथ कैप्चर ग्रुप्स के साथ काम करना भी कवर करेंगे।
<regex> लाइब्रेरी के मुख्य कम्पोनेंट्स
\n\nउदाहरणों पर जाने से पहले, मुख्य क्लासेस और फंक्शन्स को समझ लेते हैं:
\n\n- \n
- std::regex — यह क्लास रेगुलर एक्सप्रेशन (पैटर्न) को रिप्रेजेंट करती है। इसे एक स्ट्रिंग पैटर्न और ऑप्शनल ग्रामर फ्लैग (डिफ़ॉल्ट ECMAScript) के साथ बनाया जाता है। \n
- std::smatch — सर्च रिजल्ट्स को स्टोर करने का कंटेनर (
std::stringटाइप के लिए)। C-स्ट्रिंग्स के लिएstd::cmatchका उपयोग होता है। \n - std::regex_match — यह चेक करता है कि पूरी स्ट्रिंग पैटर्न से मेल खाती है या नहीं। \n
- std::regex_search — यह स्ट्रिंग में कहीं भी पैटर्न से मेल खाने वाली सबस्ट्रिंग ढूंढता है। \n
- std::regex_replace — यह पैटर्न से मेल खाने वाली सभी जगहों को निर्दिष्ट स्ट्रिंग से बदल देता है (बैकरेफरेंस सपोर्ट के साथ)। \n
सभी फंक्शन्स बिहेवियर कंट्रोल करने के लिए फ्लैग्स लेते हैं (जैसे, केस-इनसेंसिटिव सर्च के लिए std::regex_constants::icase)।
उदाहरण 1: स्ट्रिंग को पैटर्न से मैच करना (std::regex_match)
\n\nसबसे आसान काम है यह जांचना कि स्ट्रिंग किसी खास फॉर्मेट में है या नहीं। उदाहरण के लिए, जांचते हैं कि स्ट्रिंग एक वैलिड ईमेल एड्रेस है या नहीं (सरलीकृत वर्जन):
\n\n#include <iostream>\n#include <regex>\n#include <string>\n\nint main() {\n std::string email = "user@example.com";\n // ईमेल चेक करने का पैटर्न (सरलीकृत)\n std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})");\n\n if (std::regex_match(email, pattern)) {\n std::cout << "ईमेल सही है।" << std::endl;\n } else {\n std::cout << "ईमेल गलत है।" << std::endl;\n }\n\n // गलत ईमेल की जांच\n std::string bad_email = "user@.com";\n if (std::regex_match(bad_email, pattern)) {\n std::cout << "ईमेल सही है।" << std::endl;\n } else {\n std::cout << "ईमेल गलत है।" << std::endl;\n }\n\n return 0;\n}\n\nआउटपुट:
\nईमेल सही है।\nईमेल गलत है।\n\nव्याख्या:
\n- \n
- हमने रॉ स्ट्रिंग लिटरल
R"(...)"का उपयोग किया है ताकि बैकस्लैश को एस्केप न करना पड़े। \n - फंक्शन
std::regex_matchकेवल तभीtrueलौटाता है जब पूरी स्ट्रिंग पैटर्न से पूरी तरह मेल खाए। \n - पैटर्न
[a-zA-Z0-9._%+-]+का मतलब है "दिए गए सेट में से एक या अधिक कैरेक्टर"। \n
उदाहरण 2: सबस्ट्रिंग ढूंढना और डेटा निकालना (std::regex_search)
\n\nअक्सर सिर्फ जांचना नहीं, बल्कि पैटर्न के सभी मिलान ढूंढना और स्ट्रिंग के कुछ हिस्से निकालना ज़रूरी होता है। इसके लिए std::regex_search का उपयोग लूप में किया जाता है। नीचे दिए गए उदाहरण में हम टेक्स्ट से +7-XXX-XXX-XX-XX फॉर्मेट के सभी फोन नंबर ढूंढेंगे और ऑपरेटर कोड निकालेंगे:
#include <iostream>\n#include <regex>\n#include <string>\n\nint main() {\n std::string text = "संपर्क: +7-495-123-45-67 और +7-916-987-65-43। अतिरिक्त नंबर: +7-495-111-22-33।";\n // पैटर्न: +7-कोड(3 अंक)-... (कोड और बाकी के लिए कैप्चर ग्रुप)\n std::rege