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

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

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

ابدأ الدورة

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

\n\n

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

\n\n

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

\n\n

توفر حزمة regexp طريقتين رئيسيتين لتجميع التعبير النمطي:

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

يوصى باستخدام MustCompile للأنماط المضمونة الصحة (مثل تلك المحددة في الكود)، و Compile للأنماط الديناميكية التي يتم الحصول عليها من المستخدم أو من مصدر خارجي.

\n\n

مثال 1: البحث عن نص فرعي (FindString)

\n\n

تقوم الدالة FindString بإرجاع أول تطابق مع النمط على شكل سلسلة نصية. إذا لم يكن هناك تطابقات، فإنها ترجع سلسلة فارغة.

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "بريدي الإلكتروني: example@mail.com، الاحتياطي: test@example.org"\n    pattern := `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}`\n\n    re := regexp.MustCompile(pattern)\n    match := re.FindString(text)\n\n    fmt.Println("البريد الإلكتروني الموجود:", match) // الإخراج: example@mail.com\n}
\n\n

مثال 2: البحث عن جميع التطابقات (FindAllString)

\n\n

إذا كنت بحاجة إلى العثور على جميع التطابقات، استخدم FindAllString. الوسيط الثاني هو الحد الأقصى لعدد التطابقات (-1 يعني الكل).

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "الأكواد: ABC-123, XYZ-456, QWE-789"\n    pattern := `[A-Z]{3}-\\d{3}`\n\n    re := regexp.MustCompile(pattern)\n    matches := re.FindAllString(text, -1)\n\n    fmt.Println("الأكواد الموجودة:", matches)\n    // الإخراج: [ABC-123 XYZ-456 QWE-789]\n}
\n\n

مثال 3: استبدال النص (ReplaceAllString)

\n\n

تقوم ReplaceAllString باستبدال جميع تطابقات النمط بسلسلة نصية محددة. يمكن استخدام مجموعات الالتقاط بتركيبة $1 و $2 وهكذا.

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "التاريخ: 2024-01-15، تاريخ آخر: 2023-12-31"\n    pattern := `(\\d{4})-(\\d{2})-(\\d{2})`\n\n    re := regexp.MustCompile(pattern)\n    // تغيير الصيغة من YYYY-MM-DD إلى DD.MM.YYYY\n    result := re.ReplaceAllString(text, "$3.$2.$1")\n\n    fmt.Println("النتيجة:", result)\n    // الإخراج: التاريخ: 15.01.2024، تاريخ آخر: 31.12.2023\n}
\n\n

مثال 4: التحقق من مطابقة سلسلة نصية لنمط (MatchString)

\n\n

تقوم الدالة MatchString بإرجاع true إذا كان هناك تطابق واحد على الأقل في السلسلة النصية مع النمط.

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    emails := []string{"user@example.com", "invalid-email", "admin@site.org"}\n    pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`\n\n    re := regexp.MustCompile(pattern)\n    for _, email := range emails {\n        if re.MatchString(email) {\n            fmt.Printf("'%s' — بريد إلكتروني صحيح\\n", email)\n        } else {\n            fmt.Printf("'%s' — بريد إلكتروني غير صحيح\\n", email)\n        }\n    }\n    // الإخراج:\n    // 'user@example.com' — بريد إلكتروني صحيح\n    // 'invalid-email' — بريد إلكتروني غير صحيح\n    // 'admin@site.org' — بريد إلكتروني صحيح\n}
\n\n

مثال 5: استخراج البيانات باستخدام مجموعات الالتقاط (FindStringSubmatch)

\n\n

FindString

المدونات

توصيات الكتب