首頁 >後端開發 >Golang >如何處理 Go 正規表示式邊界中的非 ASCII 字元?

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

Susan Sarandon
Susan Sarandon原創
2024-10-30 02:24:021015瀏覽

 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn