首頁  >  文章  >  後端開發  >  為什麼 Go 的正規表示式 \\b 邊界對於非 ASCII 字元會失敗?

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

DDD
DDD原創
2024-10-29 00:26:02741瀏覽

Why Does Go's Regex \b Boundary Fail with Non-ASCII Characters?

Golang 正則表達式與非ASCII 字符的邊界問題

在Go 中,b 邊界選項預計在ASCII 字符的邊界匹配,不包括重音字符,例如é。處理包含非 ASCII 字元的字串時,此行為可能會導致意外結果。例如,請考慮以下程式碼:

<code class="go">package main

import (
    "fmt"
    "regexp"
)

func main() {
    r, _ := regexp.Compile(`\b(vis)\b`)
    fmt.Println(r.MatchString("re vis e")) // True
    fmt.Println(r.MatchString("revise")) // False
    fmt.Println(r.MatchString("révisé")) // True
}</code>

在此範例中,b(vis)b 正規表示式與單字邊界處的子字串「vis」相符。但是,當應用於“révisé”時,它會錯誤地返回 True,因為 é 不被視為單字字元。為了解決這個問題,您可以採用另一種方​​法:

<code class="go">r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`)
fmt.Println(r.MatchString("vis")) // True
fmt.Println(r.MatchString("re vis e")) // True
fmt.Println(r.MatchString("revise")) // False
fmt.Println(r.MatchString("révisé")) // False</code>

此解決方案利用非捕獲組(?:A|s)(vis)(?:s|z) 來匹配任何以下字元:

  • 字串開頭(A)
  • 空格

這模仿b 的行為,但包含非ASCII 字元作為潛在的單字邊界。透過組合這些組件,它可以成功匹配單字開頭或結尾的“vis”,而不管周圍的字元如何。

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

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