التعبيرات المنتظمة في Rust: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في التعبيرات المنتظمة في Rust

\n\n

التعبيرات المنتظمة (regex) هي أداة قوية للبحث عن النصوص واستخراجها واستبدالها وفقًا لنمط معين. في Rust، يتم استخدام crate regex للعمل مع التعبيرات المنتظمة - وهي واحدة من أشهر وأكثر المكتبات أداءً في النظام البيئي. في هذه المقالة، سنشرح أساسيات العمل مع regex في Rust، بدءًا من التثبيت وصولاً إلى الأمثلة العملية.

\n\n

لماذا يجب أن تتعلم التعبيرات المنتظمة في Rust؟ تقدم اللغة عملاً آمنًا وسريعًا مع النصوص، ويضمن crate regex عدم وجود تسرب للذاكرة وسرعة عالية في التنفيذ. وهذا يجعل Rust خيارًا ممتازًا لتحليل السجلات، والتحقق من صحة النماذج، ومعالجة ملفات التكوين، وغيرها من المهام.

\n\n

تثبيت وإضافة crate regex

\n\n

للبدء، أضف التبعية regex إلى ملف Cargo.toml الخاص بك:

\n\n
[dependencies]\nregex = "1.10"
\n\n

بعد ذلك، قم باستيراد الوحدة في الكود:

\n\n
use regex::Regex;
\n\n

الهيكل الأساسي الذي ستعمل معه هو Regex. يمكنك إنشاء مثيل باستخدام الطريقة Regex::new()، والتي ترجع Result، لأن النمط قد يكون غير صحيح.

\n\n
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\n

العمليات الأساسية مع التعبيرات المنتظمة

\n\n

1. التحقق من التطابق: is_match

\n\n

ترجع الطريقة is_match القيمة true إذا تم العثور على النمط في السلسلة النصية:

\n\n
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

الإخراج: تم العثور على تطابق!

\n\n

2. البحث عن أول تطابق: find

\n\n

ترجع الطريقة find القيمة Option<Match> - أول تطابق مع معلومات عن الموقع:

\n\n
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)

\n\n

3. البحث عن جميع التطابقات: find_iter

\n\n

للحصول على جميع التطابقات، استخدم المكرر find_iter:

\n\n
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\n

4. استخراج المجموعات: captures

\n\n

تسمح المجموعات في النمط (المحددة بأقواس دائرية) باستخراج أجزاء من التطابق:

\n\n
use 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\n
use regex::Regex;\n\nfn v                

المدونات

توصيات الكتب