परिचय: Rust में नियमित अभिव्यक्तियों की आवश्यकता क्यों है?
\nनियमित अभिव्यक्तियाँ (regex) पैटर्न के आधार पर टेक्स्ट खोजने, निकालने और बदलने के लिए एक शक्तिशाली उपकरण हैं। Rust में, नियमित अभिव्यक्तियों के साथ काम regex क्रेट के माध्यम से कार्यान्वित किया जाता है, जिसे पारिस्थितिकी तंत्र में सबसे तेज़ और सुरक्षित में से एक माना जाता है। कई अन्य भाषाओं के विपरीत, Rust कंपाइलर संकलन चरण में नियमित अभिव्यक्ति की शुद्धता की जाँच करता है (यदि मैक्रो regex! का उपयोग किया जाता है), जो रनटाइम के दौरान त्रुटियों से बचने में मदद करता है।
इस लेख में, हम Rust में नियमित अभिव्यक्तियों के उपयोग के व्यावहारिक उदाहरणों पर चर्चा करेंगे: बुनियादी खोज से लेकर जटिल डेटा निष्कर्षण तक। आप सीखेंगे कि प्रोजेक्ट कैसे सेट करें, पैटर्न कैसे लिखें और परिणामों को कैसे संसाधित करें।
\n\n1. प्रोजेक्ट सेटअप और पहला regex
\nनिर्भरता जोड़ना
\nशुरू करने के लिए, Cargo.toml फ़ाइल में regex क्रेट जोड़ें:
[dependencies]\nregex = "1"\nइसके बाद, cargo build कमांड से निर्भरताएँ अपडेट करें।
पहला उदाहरण: शब्द खोजना
\nएक सरल प्रोग्राम लिखते हैं जो स्ट्रिंग में "Rust" शब्द ढूँढता है:
\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"Rust").unwrap();\n let text = "मैं Rust और Python सीख रहा हूँ।";\n \n if re.is_match(text) {\n println!("'Rust' शब्द मिल गया!");\n } else {\n println!("शब्द नहीं मिला।");\n }\n}\nफ़ंक्शन Regex::new पैटर्न को संकलित करता है। यदि पैटर्न अमान्य है, तो प्रोग्राम त्रुटि के साथ समाप्त हो जाएगा (केवल प्रोटोटाइप में unwrap() का उपयोग करें)।
2. कैप्चर के साथ डेटा निकालना
\nसमूहीकरण और नामित समूह
\nनियमित अभिव्यक्तियाँ गोल कोष्ठकों का उपयोग करके टेक्स्ट के भागों को निकालने की अनुमति देती हैं। ईमेल के साथ एक उदाहरण देखें:
\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(?P<name>[a-zA-Z0-9._%+-]+)@(?P<domain>[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})").unwrap();\n let text = "मेरा ईमेल: user@example.com, और admin@test.org भी।";\n \n for caps in re.captures_iter(text) {\n println!("नाम: {}", &caps["name"]);\n println!("डोमेन: {}", &caps["domain"]);\n }\n}\nइस उदाहरण में, हम नामित समूहों (?P<name>...) का उपयोग करते हैं। यह कोड को अधिक पठनीय और आगे की प्रक्रिया के लिए सुविधाजनक बनाता है।
सभी मिलान निकालना
\nयदि समूहों के बिना सभी मिलान प्राप्त करने की आवश्यकता है, तो find_iter का उपयोग करें:
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विधि find_iter Match ऑब्जेक्ट्स पर एक इटरेटर लौटाती है, जिसमें प्रारंभ और अंत स्थितियाँ, साथ ही मिलान का टेक्स्ट शामिल होता है।
3. टेक्स्ट बदलना और जटिल पैटर्न
\nसरल प्रतिस्थापन
\nसभी अंकों को "NUMBER" शब्द से बदलें:
\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "कोड: 12345, स्थिति: 0।";\n let result = re.replace_all(text, "NUMBER");\n println!("{}", result); // "कोड: NUMBER, स्थिति: NUMBER।"\n}\n\nकैप्चर का उपयोग करके प्रतिस्थापन
\nप्रतिस्थापन स्ट्रिंग में $1, $2 या नामित समूहों $name के साथ समूहों को संदर्भित किया जा सकता है:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(?P<year>\\d{4})-(?P<month>\\d{2})-(?P<day>\\d{2})").unwrap();\n let text = "दिनांक: 2024-03-15";\n let result = re.replace_all(text, "$day.$month.$year");\n println!("{}", result); // "दिनांक: 15.03.2024"\n}\n\nजटिल पैटर्न: लॉग पार्सिंग
\nएक वास्तविक उदाहरण देखें — वेब सर्वर लॉग लाइन को पार्स करना:
\nuse regex::Regex;\n\nfn main() {\n let log_line =