التعبيرات النمطية في Go مع أمثلة: عمليًا

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

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

ابدأ الدورة

التعبيرات النمطية في Go مع أمثلة: عمليًا



التعبيرات النمطية (regex) هي أداة قوية للبحث عن النص واستخراجه واستبداله وفقًا لنمط معين. في Go (Golang)، يتم استخدام الحزمة القياسية regexp للعمل معها، والتي توفر واجهة برمجة تطبيقات فعالة وآمنة. في هذه المقالة، سنشرح الإمكانيات الرئيسية للحزمة من خلال أمثلة محددة ستساعدك على تطبيق المعرفة فورًا في المشاريع الحقيقية.



أساسيات حزمة regexp في Go



تنفذ حزمة regexp بناء جملة التعبيرات النمطية المتوافق مع RE2 (باستثناء المراجع الخلفية و lookahead/lookbehind). وهذا يجعلها سريعة ويمكن التنبؤ بها. الوظائف الرئيسية:



  • regexp.Compile(pattern) — يترجم النمط إلى كائن Regexp. يُرجع خطأ إذا كان النمط غير صحيح.
  • regexp.MustCompile(pattern) — نفس الشيء، لكنه يُحدث ذعرًا (panic) عند حدوث خطأ. مناسب للأنماط الثابتة.
  • MatchString(pattern, s) — يتحقق مما إذا كانت السلسلة s تحتوي على سلسلة فرعية تطابق النمط.


استخدم دائمًا Compile للأنماط الديناميكية (مثل تلك القادمة من إدخال المستخدم) و MustCompile للأنماط المحددة بشكل ثابت في الكود.



package main

import ( "fmt" "regexp")

func main() { // استخدام MustCompile لنمط ثابت re := regexp.MustCompile(`hello`) match := re.MatchString("hello world") fmt.Println(match) // true

// Compile لنمط ديناميكي pattern := "[0-9]+" re2, err := regexp.Compile(pattern) if err != nil { fmt.Println("خطأ في الترجمة:", err) return } fmt.Println(re2.MatchString("abc123")) // true}


البحث عن البيانات واستخراجها



غالبًا ما تحتاج ليس فقط إلى التحقق من التطابق، بل إلى استخراج أجزاء محددة من السلسلة. لهذا الغرض، تُستخدم الطرق FindString و FindStringSubmatch و FindAllString.



استخراج أول تطابق



package main

import ( "fmt" "regexp")

func main() { re := regexp.MustCompile(`\\d+`) text := "الكود: 12345, السعر: 678" // أول تطابق first := re.FindString(text) fmt.Println(first) // 12345 // جميع التطابقات all := re.FindAllString(text, -1) fmt.Println(all) // [12345 678]}


استخراج المجموعات (submatches)



تسمح المجموعات في النمط (المشار إليها بأقواس دائرية) باستخراج أجزاء من التطابق. تُرجع طريقة FindStringSubmatch شريحة (slice)، حيث العنصر الأول هو التطابق الكامل، والعناصر التالية هي قيم المجموعات.



package main

import ( "fmt" "regexp")

func main() { // النمط: اسم المستخدم @النطاق re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`) email := "user@example.com" match := re.FindStringSubmatch(email) if len(match) > 0 { fmt.Println("البريد الإلكتروني الكامل:", match[0]) // user@example.com fmt.Println("اسم المستخدم:", match[1]) // user fmt.Println("النطاق:", match[2]) // example.com }}


تقوم طريقة FindAllStringSubmatch بنفس الشيء لجميع التطابقات في السلسلة.



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



توفر حزمة regexp طريقتين للاستبدال: ReplaceAllString (استبدال بسيط) و ReplaceAllStringFunc (استبدال باستخدام دالة).



الاستبدال البسيط



package main

import ( "fmt" "regexp")

func main() { re := regexp.MustCompile(`\\s+`) // مسافة بيضاء واحدة أو أكثر text := "Hello World Go" result := re.ReplaceAllString(text, " ") fmt.Println(result) // Hello World Go}


الاستبدال باستخدام المجموعات



في سلسلة الاستبدال، يمكنك الإشارة

المدونات

توصيات الكتب