\b الحدود ذات الأحرف اللاتينية في Go Regex
في عالم التعبيرات العادية لـ Go، فإن خيار الحدود \b له ميزة طفيفة عند التعامل مع الحروف اللاتينية. تنشأ المشكلة عند محاولة تعريف الكلمات التي تحتوي على أحرف لاتينية، مثل حروف العلة المحركة والأحرف الخاصة.
فكر في المثال التالي، حيث نريد مطابقة الكلمة "vis" باستخدام خيار الحد \b:
import (
"fmt"
"regexp"
)
func main() {
r, _ := regexp.Compile(`\b(vis)\b`)
fmt.Println(r.MatchString("re vis e"))
fmt.Println(r.MatchString("revise"))
fmt.Println(r.MatchString("révisé"))
}
من المثير للدهشة أن النتيجة المتوقعة لمطابقة "révisé" كخطأ لا تحدث. بدلا من ذلك، فإنه يطابق صحيحا. وذلك لأن \b يعمل فقط على حدود الكلمات ASCII.
لحل هذه المشكلة ومطابقة الأحرف اللاتينية بدقة، يمكننا استبدال حد \b ببديل أكثر شمولاً. إليك مثال:
import (
"fmt"
"regexp"
)
func main() {
r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`)
fmt.Println(r.MatchString("vis"))
fmt.Println(r.MatchString("re vis e"))
fmt.Println(r.MatchString("revise"))
fmt.Println(r.MatchString("révisé"))
}
مع هذا التعديل، يتعرف التعبير العادي الآن على بداية ونهاية الكلمات باستخدام مزيج من بداية السلسلة (\A)، ونهاية السلسلة (\z)، والمسافة البيضاء (\s). تتطابق النتيجة بدقة مع "vis" كصحيح و"révisé" كخطأ:
true true false false
تضمن هذه التقنية مطابقة دقيقة للكلمات، بغض النظر عن وجود الأحرف اللاتينية.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3