\b Go 正規表示式中拉丁文字元的邊界
在Go 正規表示式的世界中, \b 邊界選項有一個輕微的怪癖處理拉丁字符時。當嘗試定義包含拉丁字元(例如重音元音和特殊字元)的單字時,就會出現此問題。
考慮以下範例,我們希望使用 \b 邊界選項來匹配單字「vis」:
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é"))
}
令人驚訝的是,將「révisé」配對為 false 的預期結果並未出現。相反,它匹配為 true。這是因為 \b 僅在 ASCII 單字邊界上運行。
要解決此問題並準確匹配拉丁字符,我們可以用更具包容性的替代方案替換 \b 邊界。這是一個範例:
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é"))
}
透過此修改,正規表示式現在使用字串開頭 (\A)、字串結尾 (\z) 和空格 (\s) 的組合來識別單字的開頭和結尾。結果準確地將「vis」配對為 true,將「révisé」配對為 false:
true true false false
無論是否存在拉丁字符,此技術都可確保準確的單字匹配。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3