regex في Rust: دليل شامل مع أمثلة تطبيقية

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

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

ابدأ الدورة

مكتبة regex في Rust: دليل شامل

1. ما هي ولماذا تحتاجها

مكتبة regex هي الأداة القياسية والأكثر شيوعًا للعمل مع التعبيرات المنتظمة (Regular Expressions) في لغة Rust. توفر محركًا قويًا وآمنًا وعالي الأداء للبحث عن النصوص واستخراجها واستبدالها وفق أنماط محددة. على عكس العديد من التطبيقات الأخرى، صُممت regex في Rust مع التركيز على أمان الذاكرة (memory safety) وضمان عدم وجود سلوك غير محدد (undefined behavior)، وهو أمر بالغ الأهمية في برمجة الأنظمة.

لماذا تحتاجها؟ التعبيرات المنتظمة هي لغة عالمية لوصف أنماط النصوص. يمكنك من خلالها حل مجموعة واسعة من المهام: التحقق من صحة عناوين البريد الإلكتروني وروابط URL، تحليل ملفات السجلات (logs)، استخراج البيانات من HTML/JSON، البحث والاستبدال في الأكواد، تحليل مدخلات المستخدم، وغيرها الكثير. تجعل مكتبة regex هذا الأمر سريعًا وموثوقًا. تستخدم خوارزمية قائمة على الأتمتة (Thompson NFA) تضمن وقت تنفيذ خطي بالنسبة لطول النص المدخل، مما يحميك من "التراجع الكارثي" (catastrophic backtracking) الذي تعاني منه بعض المحركات الأخرى (مثل PCRE أو مكتبة re في Python).

أهم مميزات المكتبة: دعم كامل لصياغة التعبيرات المنتظمة (المراسي، المعدّلات، المجموعات، lookahead/lookbehind، Unicode)، العمل مع تسلسلات البايت العشوائية، إمكانية تجميع التعبير مرة واحدة واستخدامه مرارًا، ودعم المُكرّرات (iterators) للبحث عن جميع التطابقات. المكتبة جزء من نظام Rust البيئي وتحظى بدعم نشط من المجتمع.

2. التثبيت

لتثبيت مكتبة regex، استخدم مدير الحزم cargo المرفق مع Rust. كل ما عليك فعله هو إضافة التبعية (dependency) إلى ملف Cargo.toml الخاص بمشروعك.

الأمر الدقيق للإضافة عبر الطرفية:

cargo add regex

أو يمكنك الإضافة يدويًا إلى قسم [dependencies] في ملف Cargo.toml:

[dependencies]
regex = "1"

بعد ذلك، نفّذ الأمر cargo build لتحميل المكتبة وتجميعها. الإصدار "1" يعني أنه سيتم استخدام أحدث إصدار مستقر من السلسلة 1.x.

3. البداية السريعة — مثال عملي بسيط

لنكتب برنامجًا بسيطًا يتحقق مما إذا كانت الجملة تحتوي على كلمة "hello" (دون مراعاة حالة الأحرف).

use regex::Regex;

fn main() {
    // تجميع التعبير المنتظم
    // (?i) — علامة لإلغاء حساسية حالة الأحرف
    let re = Regex::new(r"(?i)hello").unwrap();

    // النص المراد البحث فيه
    let text = "Hello, world!";

    // التحقق من وجود تطابق
    if re.is_match(text) {
        println!("تم العثور على تطابق!");
    } else {
        println!("لا توجد تطابقات.");
    }
}

سيخرج هذا الكود: تم العثور على تطابق!. لاحظ استخدام .unwrap() — تم استخدامه هنا للتبسيط، ولكن في الكود الفعلي يجب معالجة أخطاء تجميع التعبير المنتظم (مثلًا إذا كان النمط غير صحيح).

4. الدوال الأساسية

فيما يلي الدوال والطرق الرئيسية لمكتبة regex. جميع الأمثلة تفترض أنك قمت باستيراد المكتبة باستخدام use regex::Regex;.

4.1. Regex::new(pattern: &str) -> Result<Regex, Error>

الوظيفة: تجميع النص pattern إلى تعبير منتظم. تُرجع Result يجب معالجته في حالة وجود خطأ في الصياغة.

let re = Regex::new(r"^\d{3}-\d{2}-\d{4}$").expect("تعبير منتظم غير صحيح");
// أصبح re جاهزًا للاستخدام

4.2. is_match(&self, text: &str) -> bool

الوظيفة: التحقق مما إذا كان هناك تطابق واحد على الأقل للنمط في النص text.

let re = Regex::new(r"\d+").unwrap();
assert!(re.is_match("abc123")); // true
assert!(!re.is_match("abc"));   // false

توصيات