Sempadan Ungkapan Biasa Golang dan Aksara Bukan ASCII
Sempadan ungkapan biasa Golang (b) direka bentuk untuk memadankan sempadan antara aksara ASCII dan aksara bukan ASCII. Walau bagaimanapun, dalam senario tertentu, ia mungkin tidak berkelakuan seperti yang diharapkan apabila aksara Latin terlibat.
Masalahnya
In Go, sempadan b hanya berfungsi apabila ia mengelilingi ASCII watak. Sebagai contoh, regex b(vis)b bertujuan untuk memadankan perkataan "vis". Walau bagaimanapun, apabila perkataan "vis" mengandungi aksara Latin, seperti "revisé", b gagal mengenalinya sebagai sempadan perkataan.
Pertimbangkan kod Go berikut:
<code class="go">package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile(`\b(vis)\b`) fmt.Println(r.MatchString("re vis e")) // Expected true fmt.Println(r.MatchString("revise")) // Expected true fmt.Println(r.MatchString("révisé")) // Expected false }</code>
Berjalan kod ini menghasilkan:
true true true
Perhatikan bahawa baris terakhir tidak sepadan dengan "revisé".
Penyelesaian
Untuk mengendalikan kes dengan bukan- aksara ASCII, anda boleh menentukan corak sempadan tersuai anda sendiri. Satu pendekatan ialah menggantikan b dengan regex berikut:
(?:\A|\s)(vis)(?:\s|\z)
Corak ini bermaksud:
Sempadan tersuai ini dengan berkesan mencapai apa yang b lakukan untuk aksara ASCII, tetapi ia juga meluas kepada aksara bukan ASCII seperti aksara Latin.
Dengan memasukkan corak tersuai ini ke dalam regex, anda boleh memperoleh hasil yang diingini:
<code class="go">package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`) fmt.Println(r.MatchString("vis")) // Added this case fmt.Println(r.MatchString("re vis e")) fmt.Println(r.MatchString("revise")) fmt.Println(r.MatchString("révisé")) }</code>
Menjalankan kod ini sekarang memberikan:
true true false false
Seperti yang anda lihat, "revisé" dikecualikan dengan betul sebagai padanan.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Aksara Bukan ASCII dalam Sempadan Ungkapan Biasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!