Rust में रेगुलर एक्सप्रेशन: व्यावहारिक उदाहरणों के साथ
\n\nरेगुलर एक्सप्रेशन (regex) टेक्स्ट के साथ काम करने का एक शक्तिशाली टूल है। Rust में, सख्त टाइपिंग और सुरक्षा पर फोकस के बावजूद, regex क्रेट की बदौलत रेगुलर एक्सप्रेशन के साथ काम करना कुशल और सुविधाजनक है। इस लेख में, हम Rust में रेगुलर एक्सप्रेशन का व्यावहारिक उपयोग समझेंगे: इंस्टॉलेशन से लेकर जटिल स्ट्रिंग प्रोसेसिंग तक।
हम मुख्य ऑपरेशनों को कवर करेंगे: सर्च, एक्सट्रैक्शन, रिप्लेस और वैलिडेशन। सभी कोड उदाहरण Rust में लिखे गए हैं और उपयोग के लिए तैयार हैं।
\n\nregex क्रेट की स्थापना और कनेक्शन
\n\nRust में रेगुलर एक्सप्रेशन के साथ काम करने के लिए, एक तृतीय-पक्ष लेकिन बहुत लोकप्रिय क्रेट regex का उपयोग किया जाता है। यह मानक लाइब्रेरी का हिस्सा नहीं है, इसलिए इसे प्रोजेक्ट में जोड़ना होगा।
Cargo.toml फ़ाइल में डिपेंडेंसी जोड़ें:
[dependencies]\nregex = "1"\n\nइसके बाद, कोड में मुख्य टाइप्स को इम्पोर्ट किया जा सकता है:
\n\nuse regex::Regex;\n\nregex क्रेट रेगुलर एक्सप्रेशन को एक फाइनाइट ऑटोमेटन में कंपाइल करता है, जो उच्च प्रदर्शन सुनिश्चित करता है। पैटर्न कंपाइलेशन की त्रुटियाँ रनटाइम पर (Result के माध्यम से) पकड़ी जाती हैं, जो कोड को विश्वसनीय बनाती हैं।
मूल बातें: स्ट्रिंग में मिलान खोजना
\n\nयह जाँचने का सबसे सरल तरीका कि स्ट्रिंग पैटर्न से मेल खाती है या नहीं, is_match मेथड का उपयोग करना है। आइए टेक्स्ट में ईमेल पते की उपस्थिति की जाँच का उदाहरण देखें।
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b").unwrap();\n let text = "हमसे support@example.com पर संपर्क करें।";\n\n if re.is_match(text) {\n println!("ईमेल मिल गया!");\n } else {\n println!("ईमेल नहीं मिला।");\n }\n}\n\nRegex::new मेथड पैटर्न के साथ एक स्ट्रिंग लेता है और Result लौटाता है। सरलता के लिए यहाँ unwrap() का उपयोग किया गया है, लेकिन प्रोडक्शन कोड में त्रुटियों को सही ढंग से संभालना चाहिए।
सभी मिलान खोजने के लिए find_iter मेथड का उपयोग किया जाता है, जो Match ऑब्जेक्ट्स पर एक इटरेटर लौटाता है:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "कीमतें: 100, 250 और 500 रुपये।";\n\n for mat in re.find_iter(text) {\n println!("संख्या मिली: {}", mat.as_str());\n }\n}\n\nयह कोड आउटपुट देगा:
\n\nसंख्या मिली: 100\nसंख्या मिली: 250\nसंख्या मिली: 500\n\nकैप्चरिंग ग्रुप्स के साथ डेटा निकालना
\n\nकैप्चरिंग ग्रुप्स (capturing groups) आपको पूरे मिलान के बजाय उसके अलग-अलग हिस्सों को निकालने की अनुमति देते हैं। उदाहरण के लिए, "दिन-महीना-साल" प्रारूप में दिनांक को पार्स करना।
\n\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(\\d{2})-(\\d{2})-(\\d{4})").unwrap();\n let text = "आज 15-03-2024 है।";\n\n if let Some(caps) = re.captures(text) {\n println!("दिन: {}", &caps[1]);\n println!("महीना: {}", &caps[2]);\n println!("साल: {}", &caps[3]);\n }\n}\n\nग्रुप्स की इंडेक्सिंग 1 से शुरू होती है (ग्रुप 0 पूरा मिलान है)। captures मेथड Option<Captures> लौटाता है। यदि मिलान मिलता है, तो हम इंडेक्स के माध्यम से ग्रुप्स तक पहुँच सकते हैं।
ग्रुप्स के साथ सभी उदाहरण निकालने के लिए captures_iter का उपयोग किया जाता है:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap();\n let text = "ईमेल: user@host.com, admin@site.org";\n\n for caps in re.captures_iter(text) {\n println!("लॉगिन: {}, डोमेन: {}, ज़ोन: {}", &caps[1], &caps[2], &caps[3]);\n }\n}\n\nयह दृष्टिकोण लॉग्स, कॉन्फ़िगरेशन फ़ाइलों को पार्स करने या असंरचित टेक्स्ट से संरचित डेटा निकालने के लिए अपरिहार्य है।
\n\nपैटर्न के अनुसार टेक्स्ट बदलना
\n\nregex क्रेट टेक्स्ट को बदलने के लिए कई मेथड प्रदान करता है। सबसे सरल है replace, जो पहले मिलान को बदलता है:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\bRust\\b").unwrap();\n let text = "Rust एक शानदार भाषा है। मुझे Rust पसंद है।";\n let result = re.replace(text, "Go");\n println!("{}", result);\n}\n\nयह आउटपुट देगा: "Go एक शानदार भाषा है। मुझे Rust पसंद है।"
\n\nसभी मिलान बदलने के लिए replace_all का उपयोग करें:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\bRust\\b").unwrap();\n let text = "Rust एक शानदार भाषा है। मुझे Rust पसंद है।";\n let result = re.replace_all(text, "Go");\n println!("{}", result);\n}\n\nयह आउटपुट देगा: "Go एक शानदार भाषा है। मुझे Go पसंद है।"
\n\nरिप्लेसमेंट स्ट्रिंग में कैप्चरिंग ग्रुप्स के संदर्भों का उपयोग किया जा सकता है:
\n\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap();\n let text = "ईमेल: user@example.com";\n let result = re.replace_all(text, "$1 at $2 dot $3");\n println!("{}", result);\n}\n\nयह आउटपुट देगा: "ईमेल: user at example dot com"
\n\nअधिक जटिल प्रतिस्थापनों के लिए, आप एक क्लोजर पास कर सकते हैं:
\n\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\b(\\d+)\\b").unwrap();\n let text = "मेरे पास 10 सेब और 20 संतरे हैं।";\n let result = re.replace_all(text, |caps: ®ex::Captures| {\n let num: i32 = caps[1].parse().unwrap();\n (num * 2).to_string()\n });\n println!("{}", result);\n}\n\nयह आउटपुट देगा: "मेरे पास 20 सेब और 40 संतरे हैं।"
\n\nस्ट्रिंग वैलिडेशन
\n\nरेगुलर एक्सप्रेशन का उपयोग अक्सर इनपुट डेटा को मान्य करने के लिए किया जाता है। आइए फ़ोन नंबर वैलिडेशन का उदाहरण देखें:
\n\nuse regex::Regex;\n\nfn validate_phone(phone: &str) -> bool {\n let re = Regex::new(r"^\\+?[1-9]\\d{1,14}$").unwrap();\n re.is_match(phone)\n}\n\nfn main() {\n let phones = vec!["+79123456789", "12345", "+1234567890123456"];\n for phone in phones {\n println!("{}: {}", phone, validate_phone(phone));\n }\n}\n\nयह कोड जाँचता है कि फ़ोन नंबर अंतर्राष्ट्रीय प्रारूप (E.164) से मेल खाता है या नहीं।
\n\nनिष्कर्ष
\n\nRust में regex क्रेट रेगुलर एक्सप्रेशन के साथ काम करने का एक शक्तिशाली और कुशल तरीका प्रदान करता है। हमने कवर किया:
- \n
- क्रेट को स्थापित करना और कनेक्ट करना \n
- बुनियादी मिलान खोजना \n
- कैप्चरिंग ग्रुप्स का उपयोग करके डेटा निकालना \n
- सरल और जटिल टेक्स्ट प्रतिस्थापन \n
- इनपुट डेटा वैलिडेशन \n
ये तकनीकें लॉग प्रोसेसिंग, डेटा पार्सिंग, फॉर्म वैलिडेशन और कई अन्य कार्यों में उपयोगी हैं। regex क्रेट के बारे में अधिक जानकारी के लिए, आधिकारिक दस्तावेज़ देखें।