مقدمة في التعبيرات المنتظمة في Rust
\n\nالتعبيرات المنتظمة (regex) هي أداة قوية للبحث عن النصوص واستخراجها واستبدالها وفقًا لنمط معين. في Rust، يتم استخدام crate regex للعمل مع التعبيرات المنتظمة - وهي واحدة من أشهر وأكثر المكتبات أداءً في النظام البيئي. في هذه المقالة، سنشرح أساسيات العمل مع regex في Rust، بدءًا من التثبيت وصولاً إلى الأمثلة العملية.
لماذا يجب أن تتعلم التعبيرات المنتظمة في Rust؟ تقدم اللغة عملاً آمنًا وسريعًا مع النصوص، ويضمن crate regex عدم وجود تسرب للذاكرة وسرعة عالية في التنفيذ. وهذا يجعل Rust خيارًا ممتازًا لتحليل السجلات، والتحقق من صحة النماذج، ومعالجة ملفات التكوين، وغيرها من المهام.
تثبيت وإضافة crate regex
\n\nللبدء، أضف التبعية regex إلى ملف Cargo.toml الخاص بك:
[dependencies]\nregex = "1.10"\n\nبعد ذلك، قم باستيراد الوحدة في الكود:
\n\nuse regex::Regex;\n\nالهيكل الأساسي الذي ستعمل معه هو Regex. يمكنك إنشاء مثيل باستخدام الطريقة Regex::new()، والتي ترجع Result، لأن النمط قد يكون غير صحيح.
fn main() {\n let re = Regex::new(r"^\\d{3}-\\d{2}-\\d{4}$").unwrap();\n println!("تم إنشاء Regex: {}", re.as_str());\n}\n\nلاحظ: يتم كتابة النمط في سلاسل نصية خام (r"...") لتجنب الهروب من الخطوط المائلة العكسية.
العمليات الأساسية مع التعبيرات المنتظمة
\n\n1. التحقق من التطابق: is_match
\n\nترجع الطريقة is_match القيمة true إذا تم العثور على النمط في السلسلة النصية:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"hello").unwrap();\n let text = "hello world";\n \n if re.is_match(text) {\n println!("تم العثور على تطابق!");\n } else {\n println!("لا توجد تطابقات");\n }\n}\n\nالإخراج: تم العثور على تطابق!
2. البحث عن أول تطابق: find
\n\nترجع الطريقة find القيمة Option<Match> - أول تطابق مع معلومات عن الموقع:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "الكود: 12345، السعر: 678";\n \n if let Some(m) = re.find(text) {\n println!("تم العثور على: '{}' (الموقع {}..{})", m.as_str(), m.start(), m.end());\n }\n}\n\nالإخراج: تم العثور على: '12345' (الموقع 6..11)
3. البحث عن جميع التطابقات: find_iter
\n\nللحصول على جميع التطابقات، استخدم المكرر find_iter:
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "الأرقام: 42, 100, 7";\n \n for m in re.find_iter(text) {\n println!("الرقم: {}", m.as_str());\n }\n}\n\nالإخراج:
\nالرقم: 42\nالرقم: 100\nالرقم: 7\n\n4. استخراج المجموعات: captures
\n\nتسمح المجموعات في النمط (المحددة بأقواس دائرية) باستخراج أجزاء من التطابق:
\n\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap();\n let email = "user@example.com";\n \n if let Some(caps) = re.captures(email) {\n println!("البريد الإلكتروني الكامل: {}", &caps[0]);\n println!("الاسم: {}", &caps[1]);\n println!("النطاق: {}", &caps[2]);\n println!("المنطقة: {}", &caps[3]);\n }\n}\n\nالإخراج:
\nالبريد الإلكتروني الكامل: user@example.com\nالاسم: user\nالنطاق: example\nالمنطقة: com\n\nأمثلة عملية للاستخدام
\n\nمثال 1: التحقق من صحة رقم الهاتف
\n\nدعنا نتحقق مما إذا كانت السلسلة النصية تتطابق مع تنسيق الرقم الروسي (مثل +7-XXX-XXX-XX-XX):
\n\nuse regex::Regex;\n\nfn v