مقدمة: التعبيرات المنتظمة في Rust — أداة قوية لمعالجة النصوص
التعبيرات المنتظمة (regex) هي جزء لا يتجزأ من أدوات أي مطور يعمل مع النصوص. في Rust، التي تشتهر بأدائها وأمانها، يتم تنفيذ العمل مع التعبيرات المنتظمة من خلال الكريت الشهير regex. توفر هذه المكتبة طريقة سريعة وموثوقة للبحث عن أنماط النصوص واستخراجها واستبدالها.
في هذه المقالة، سنشرح بالتفصيل كيفية استخدام التعبيرات المنتظمة في Rust: بدءًا من تثبيت الكريت وصولاً إلى التقنيات المتقدمة. ستتعلم كيفية التحقق من التطابقات، واستخراج البيانات، واستبدال النصوص، ومعالجة الأخطاء. جميع أمثلة الكود مكتوبة بلغة Rust وجاهزة للاستخدام.
1. تثبيت وتوصيل كريت regex
للعمل مع التعبيرات المنتظمة في Rust، يجب إضافة الكريت regex إلى ملف Cargo.toml:
[dependencies]regex = "1"بعد ذلك، يمكن استيراد الوحدات الضرورية إلى الكود:
use regex::Regex;يقوم كريت regex تلقائيًا بتجميع التعبيرات المنتظمة إلى تنسيق داخلي فعال، مما يضمن سرعة عالية في الأداء.
2. العمليات الأساسية مع regex في Rust
2.1 التحقق من التطابق (is_match)
تقوم طريقة is_match بإرجاع true إذا كان النص يحتوي على تطابق واحد على الأقل مع النمط:
use regex::Regex;
fn main() { let re = Regex::new(r"\\d+").unwrap(); let text = "اليوم 25 ديسمبر";
if re.is_match(text) { println!("النص يحتوي على أرقام"); } else { println!("لم يتم العثور على أرقام"); }}هذه الطريقة مفيدة للتحقق السريع: التحقق مما إذا كان النص يحتوي على بريد إلكتروني أو رقم هاتف أو أنماط أخرى.
2.2 البحث عن أول تطابق (find)
تقوم طريقة find بإرجاع أول تطابق على شكل هيكل Match، الذي يحتوي على بداية ونهاية التطابق:
use regex::Regex;
fn main() { let re = Regex::new(r"\\b\\w+@\\w+\\.\\w+\\b").unwrap(); let text = "بريدي الإلكتروني: user@example.com، وأيضًا admin@test.org";
if let Some(mat) = re.find(text) { println!("تم العثور على بريد إلكتروني: {}", mat.as_str()); println!("الموضع: {}..{}", mat.start(), mat.end()); }}نتيجة التنفيذ:
تم العثور على بريد إلكتروني: user@example.comالموضع: 19..352.3 البحث عن جميع التطابقات (find_iter)
للحصول على جميع التطابقات، يتم استخدام المكرر find_iter:
use regex::Regex;
fn main() { let re = Regex::new(r"\\d+").unwrap(); let text = "الأسعار: 100 و 250 و 500 روبل";
for mat in re.find_iter(text) { println!("رقم: {}", mat.as_str()); }}الإخراج:
رقم: 100رقم: 250رقم: 5003. استخراج المجموعات باستخدام الأقواس الالتقاطية
واحدة من أقوى إمكانيات التعبيرات المنتظمة هي المجموعات الالتقاطية. تسمح باستخراج أجزاء من التطابق:
use regex::Regex;
fn main() { let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap(); let text = "user@example.com";
if let Some(caps) = re.captures(text) { println!("البريد الإلكتروني الكامل: {}", &caps[0]); println!("اسم المستخدم: {}", &caps[1]); println!("النطاق: {}", &caps[2]); println!("المنطقة: {}", &caps[3]); }}يتم ترقيم المجموعات بدءًا من 1. المجموعة 0 هي التطابق بأكمله.
يمكن أيضًا استخدام المجموعات المسماة لجعل الكود أكثر قابلية للقراءة:
use regex::Regex;
fn main() { let re = Regex::new(r"(?P<name>\\w+)@(?P<domain>\\w+\\.\\w+)").unwrap(); let text = "admin@test.org";
if let Some(caps) = re.captures(text) { println!("الاسم: {}", caps.name("name").unwrap().as_str