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

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

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

ابدأ الدورة

التعبيرات المنتظمة في Rust: أداة قوية للعمل مع النصوص

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



تثبيت وتوصيل كريت regex

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

[dependencies]regex = "1"

ثم قم باستيراد الوحدات الضرورية في الكود:

use regex::Regex;


إنشاء واستخدام أساسي للتعبيرات المنتظمة

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

use regex::Regex;

fn main() { let re = Regex::new(r"hello").unwrap(); let text = "hello world, hello Rust!"; // التحقق من وجود تطابق if re.is_match(text) { println!("تم العثور على تطابق!"); } // البحث عن أول تطابق match re.find(text) { Some(mat) => println!("تم العثور على: '{}'", mat.as_str()), None => println!("لا توجد تطابقات"), } // البحث عن جميع التطابقات for mat in re.find_iter(text) { println!("تم العثور على: '{}' في الموضع {}", mat.as_str(), mat.start()); }}

لاحظ استخدام السلسلة النصية الخام (r"..."). هذا يتجنب الحاجة إلى هروب الشرطات المائلة العكسية، وهو أمر مريح بشكل خاص عند العمل مع التعبيرات المنتظمة.



مجموعات الالتقاط واستخراج البيانات

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

use regex::Regex;

fn main() { // استخراج تاريخ بتنسيق YYYY-MM-DD let re = Regex::new(r"(\\d{4})-(\\d{2})-(\\d{2})").unwrap(); let text = "اليوم: 2024-01-15, الأمس: 2024-01-14"; for cap in re.captures_iter(text) { println!("السنة: {}, الشهر: {}, اليوم: {}", &cap[1], &cap[2], &cap[3]); } // استخراج عناوين البريد الإلكتروني let email_re = Regex::new(r"([\\w.]+)@([\\w.]+)").unwrap(); let email_text = "جهات الاتصال: user@example.com, admin@test.org"; if let Some(caps) = email_re.captures(email_text) { println!("اسم المستخدم: {}", &caps[1]); println!("النطاق: {}", &caps[2]); }}

يمكن تسمية المجموعات لتحسين قابلية قراءة الكود:

use regex::Regex;

fn main() { let re = Regex::new(r"(?P<year>\\d{4})-(?P<month>\\d{2})-(?P<day>\\d{2})").unwrap(); let text = "2024-01-15"; if let Some(caps) = re.captures(text) { println!("السنة: {}", caps.name("year").unwrap().as_str()); println!("الشهر: {}", caps.name("month").unwrap().as_str()); println!("اليوم: {}", caps.name("day").unwrap().as_str()); }}


استبدال النص باستخدام التعبيرات المنتظمة

يوفر كريت regex دوال قوية لاستبدال النص. لنلقِ نظرة على عدة خيارات:

use regex::Regex;

fn main() { let re = Regex::new(r"\\d+").unwrap(); let text = "لدي قطتان و 3 كلاب"; // استبدال بسيط لجميع الأرقام بكلمة let result = re.replace_all(text, "عدة"); println!("{}", result); // "لدي عدة قطط و عدة كلاب" // استبدال باستخدام مجموعات الالتقاط let re2 = Regex::new(r"(\\w+)@(\\w+)").unwrap(); let email = "user@example.com"; let replaced = re2.rep

المدونات

توصيات الكتب