التعبيرات النمطية في Go: أداة قوية للعمل مع النصوص
التعبيرات النمطية (regex) هي أداة لا غنى عنها للبحث عن النص واستخراجه واستبداله وفقًا لنمط معين. في لغة Go (Golang)، يتم العمل مع التعبيرات النمطية من خلال الحزمة القياسية regexp. توفر هذه الحزمة طريقة سريعة وآمنة للعمل مع الأنماط، باستخدام بناء جملة مشابه لـ Perl و RE2. في هذه المقالة، سنشرح الوظائف الرئيسية للحزمة من خلال أمثلة عملية.
1. أساسيات العمل مع حزمة regexp
تتبع حزمة regexp مبدأ "جمّع مرة واحدة، استخدم عدة مرات". وهذا يحسن الأداء عند استخدام نفس النمط بشكل متكرر. الوظائف الرئيسية:
regexp.Compile(expr)— تجميع التعبير النمطي. تُرجع*Regexpورسالة خطأ.regexp.MustCompile(expr)— نفس الشيء، ولكنها تُحدث حالة ذعر (panic) عند حدوث خطأ. مناسبة لتهيئة المتغيرات العامة.regexp.MatchString(expr, s)— تتحقق مما إذا كانت السلسلةsتحتوي على تطابق واحد على الأقل مع النمط.
package main
import ( "fmt" "regexp")
func main() { // فحص بسيط: هل تحتوي السلسلة على أرقام؟ matched, _ := regexp.MatchString(`\\d+`, "الطلب رقم 12345") fmt.Println(matched) // true
// تجميع النمط للاستخدام المتكرر re := regexp.MustCompile(`[a-z]+`) fmt.Println(re.MatchString("hello")) // true fmt.Println(re.MatchString("HELLO")) // false}لاحظ: بشكل افتراضي، تبحث MatchString عن تطابق جزئي (مثل strings.Contains). للتطابق الكامل للسلسلة مع النمط، استخدم علامات الارتساء ^ و $.
2. البحث عن البيانات واستخراجها
للبحث عن جميع التطابقات أو أول تطابق، استخدم الطرق FindString و FindAllString و FindStringSubmatch ونظائرها لمقاطع البايت.
2.1. البحث عن أول تطابق
re := regexp.MustCompile(`\\b\\w+@\\w+\\.\\w+\\b`)email := re.FindString("اتصل بنا: support@example.com أو info@test.org")fmt.Println(email) // support@example.com2.2. البحث عن جميع التطابقات
re := regexp.MustCompile(`\\d{4}`)numbers := re.FindAllString("الأكواد: 1234, 5678, 9012", -1)fmt.Println(numbers) // [1234 5678 9012]الوسيطة الثانية لـ FindAllString هي الحد الأقصى لعدد التطابقات. -1 تعني "الكل".
2.3. مجموعات الالتقاط (submatch)
تسمح مجموعات الالتقاط باستخراج أجزاء من التطابق. يتم تعريفها باستخدام الأقواس المستديرة ().
re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`)match := re.FindStringSubmatch("user@example.com")fmt.Println(match) // [user@example.com user example.com]// match[0] — التطابق الكامل// match[1] — المجموعة الأولى (user)// match[2] — المجموعة الثانية (example.com)3. استبدال النص باستخدام التعبيرات النمطية
توفر حزمة regexp طريقتين رئيسيتين للاستبدال:
ReplaceAllString(src, repl)— تستبدل جميع التطابقات بالسلسلةrepl.ReplaceAllStringFunc(src, replFunc)— تستبدل كل تطابق باستخدام دالة رد اتصال.
3.1. استبدال بسيط
re := regexp.MustCompile(`\\s+`)result := re.ReplaceAllString("مسافات كثيرة هنا", " ")fmt.Println(result) // "مسافات كثيرة هنا"3.2. استبدال باستخدام مجموعات الالتقاط
في سلسلة الاستبدال، يمكن الإشارة إلى المجموعات باستخدام $1 و $2 وهكذا.
re := regexp.MustCompile(`(\\w+)\\s+(\\w+)`)result := re.ReplaceAllString("إيفان بيتروف", "$2, $1")