Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengendalikan Aksara Bukan ASCII dalam Sempadan Ungkapan Biasa Go?

Bagaimana Mengendalikan Aksara Bukan ASCII dalam Sempadan Ungkapan Biasa Go?

Susan Sarandon
Lepaskan: 2024-10-30 02:24:02
asal
1008 orang telah melayarinya

 How to Handle Non-ASCII Characters in Go's Regular Expression Boundaries?

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>
Salin selepas log masuk

Berjalan kod ini menghasilkan:

true
true
true
Salin selepas log masuk

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)
Salin selepas log masuk

Corak ini bermaksud:

  • (?:A|s): Padan dengan permulaan rentetan atau ruang putih watak.
  • (vis): Menangkap perkataan "vis".
  • (?:s|z): Padan dengan aksara ruang putih atau hujung rentetan.

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>
Salin selepas log masuk

Menjalankan kod ini sekarang memberikan:

true
true
false
false
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan