首頁 > 後端開發 > Golang > 為什麼 Go 正規表示式 \\b 邊界對於拉丁字元會失敗?

為什麼 Go 正規表示式 \\b 邊界對於拉丁字元會失敗?

Barbara Streisand
發布: 2024-11-03 04:20:31
原創
862 人瀏覽過

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

b Go 正規表示式中帶有拉丁字元的邊界

在Go 正規表示式的世界中,b 邊界選項在處理時有一個輕微的怪癖帶有拉丁字符。當嘗試定義包含拉丁字元(例如重音元音和特殊字元)的單字時,就會出現此問題。

考慮以下範例,我們希望使用b 邊界選項來匹配單字「vis」:

<code class="go">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é"))
}</code>
登入後複製

令人驚訝的是,將「révisé」配對為false 的預期結果並沒有出現。相反,它匹配為 true。這是因為 b 僅在 ASCII 單字邊界上運行。

為了解決此問題並準確匹配拉丁字符,我們可以用更具包容性的替代方案替換 b 邊界。以下是一個範例:

<code class="go">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é"))
}</code>
登入後複製

透過此修改,正規表示式現在使用字串開頭(A)、字串結尾(z) 和空格(s) 的組合來識別單字的開頭和結尾。結果準確地將“vis”匹配為 true,將“révisé”匹配為 false:

true
true
false
false
登入後複製

無論是否存在拉丁字符,此技術都可確保準確的單詞匹配。

以上是為什麼 Go 正規表示式 \\b 邊界對於拉丁字元會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板