التعبيرات النمطية في Go (Golang): دليل كامل للمبتدئين
\n\nالتعبيرات النمطية (regex) هي أداة قوية للبحث عن النص واستخراجه واستبداله وفق أنماط محددة. في لغة Go (Golang)، يتم تنفيذ العمل مع التعبيرات النمطية من خلال الحزمة القياسية regexp. في هذه المقالة، سنشرح أساسيات العمل مع regexp في Go، ونستعرض الوظائف الرئيسية ونقدم أمثلة عملية ستساعدك على البدء في استخدام التعبيرات النمطية في مشاريعك.
ما هي التعبيرات النمطية ولماذا نحتاجها في Go؟
\n\nالتعبير النمطي هو سلسلة من الأحرف تحدد نمطًا للبحث في النص. على سبيل المثال، يمكنك التحقق مما إذا كانت السلسلة تحتوي على بريد إلكتروني أو رقم هاتف أو تنسيق بيانات معين. في Go، توفر حزمة regexp وظائف لتجميع الأنماط والبحث عن التطابقات واستبدال النص واستخراج السلاسل الفرعية.
الإمكانيات الرئيسية لـ regexp:
- \n
- البحث — التحقق من وجود سلسلة فرعية تطابق النمط. \n
- الاستخراج — الحصول على جميع التطابقات أو المجموعات الفردية. \n
- الاستبدال — استبدال الأجزاء التي تم العثور عليها بنص آخر. \n
- التحقق من الصحة — التحقق من تنسيق السلسلة (البريد الإلكتروني، كلمة المرور، URL). \n
تثبيت واستيراد حزمة regexp
\n\nحزمة regexp مضمنة في المكتبة القياسية لـ Go، لذلك لا تحتاج إلى تثبيت أي شيء. لاستخدامها، يكفي استيرادها في بداية الملف:
import (\n "fmt"\n "regexp"\n)\n\n1. تجميع التعبير النمطي: Compile و MustCompile
\n\nالخطوة الأولى في العمل مع التعبيرات النمطية هي تجميع النمط. في Go، هناك طريقتان رئيسيتان:
\n\n- \n
regexp.Compile(expr)— تُرجع تعبيرًا مُجمَّعًا ورسالة خطأ إذا كان النمط غير صحيح. \n regexp.MustCompile(expr)— مشابهة، ولكنها تُحدث ذعرًا (panic) عند حدوث خطأ. مناسبة للأنماط الثابتة. \n
مثال:
\n\npackage main\n\nimport (\n "fmt"\n "regexp"\n)\n\nfunc main() {\n // نستخدم MustCompile لأن النمط صحيح مسبقًا\n re := regexp.MustCompile(`[a-z]+`)\n \n // Compile مع معالجة الخطأ\n re2, err := regexp.Compile(`[0-9]+`)\n if err != nil {\n fmt.Println("خطأ في التجميع:", err)\n return\n }\n fmt.Println(re, re2)\n}\n\n2. الطرق الأساسية للبحث والتحقق
\n\nبعد التجميع، لدينا كائن *regexp.Regexp مع مجموعة من الطرق. دعنا نستعرض أكثرها فائدة.
MatchString — التحقق من التطابق
\nالطريقة MatchString(s string) bool تُرجع true إذا كانت السلسلة تحتوي على تطابق واحد على الأقل مع النمط.
re := regexp.MustCompile(`go`)\nfmt.Println(re.MatchString("golang")) // true\nfmt.Println(re.MatchString("python")) // false\n\nFindString — البحث عن أول تطابق
\nتُرجع أول سلسلة فرعية تطابق النمط.
\n\nre := regexp.MustCompile(`[0-9]+`)\nfmt.Println(re.FindString("السعر: 100 روبل، خصم 20%")) // "100"\n\nFindAllString — البحث عن جميع التطابقات
\nتُرجع شريحة من جميع السلاسل التي تم العثور عليها. الوسيط الثاني هو الحد الأقصى لعدد التطابقات (-1 يعني الكل).
re := regexp.MustCompile(`[0-9]+`)\nresult := re.FindAllString("السعر: 100 روبل، خصم 20%", -1)\nfmt.Println(result) // ["100", "20"]\n\n3. استخراج المجموعات باستخدام التعبيرات الفرعية
\n\nالأقواس المستديرة في النمط تُنشئ مجموعات التقاط (capturing groups). الطريقة FindStringSubmatch تُرجع شريحة حيث العنصر الأول هو التطابق الكامل، والعناصر التالية هي قيم المجموعات.
re := regexp.MustCompile(`(\\d{4})-(\\d{2})-(\\d{2})`)\ndate := "التاريخ: 2023-12-25"\nmatches := re.FindStringSu