首頁 > 後端開發 > Golang > 主體

如何處理 Go 正規表示式邊界中的非 ASCII 字元?

Susan Sarandon
發布: 2024-10-30 02:24:02
原創
937 人瀏覽過

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

Golang 正規表示式邊界和非ASCII 字元

Go 的正規表示式邊界(b)旨在匹配ASCII 字元和非ASCII字元之間的邊界非ASCII 字元。但是,在某些情況下,當涉及拉丁字符時,它可能不會按預期運行。

問題

在 Go 中,b 邊界僅在包圍 ASCII 時才起作用人物。例如,正規表示式 b(vis)b 旨在匹配單字「vis」。然而,當單字“vis”包含拉丁字元時,例如“révisé”,b 無法將其識別為單字邊界。

考慮以下 Go 程式碼:

<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>
登入後複製

執行此程式碼產生:

true
true
true
登入後複製

注意最後一行錯誤地符合「révisé」。

解決方案

處理非以下情況ASCII 字符,您可以定義自己的自訂邊界圖案。一種方法是將b 替換為以下正規表示式:

(?:\A|\s)(vis)(?:\s|\z)
登入後複製

此模式表示:

  • (?:A|s):符合字串的開頭或空格字元。
  • (vis):捕獲單字「vis」。
  • (?:s|z):符合空白字元或字串結尾。

此自訂邊界有效地實現了 b 對 ASCII 字符所做的操作,但它也擴展到了非 ASCII 字符,例如拉丁字符。

透過將此自訂模式合併到正規表示式中,您可以獲得所需的結果:

<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>
登入後複製

執行此程式碼現在會給出:

true
true
false
false
登入後複製

如您所見,「révisé」被正確排除為配對。

以上是如何處理 Go 正規表示式邊界中的非 ASCII 字元?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!