"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يفشل Go Regex \\b Boundary مع الأحرف اللاتينية؟

لماذا يفشل Go Regex \\b Boundary مع الأحرف اللاتينية؟

تم النشر بتاريخ 2024-11-08
تصفح:607

 Why Does Go Regex \b Boundary Fail with Latin Characters?

\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