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)
此模式表示:
此自訂邊界有效地實現了 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中文網其他相關文章!