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) 來匹配任何以下字元:
這模仿b 的行為,但包含非ASCII 字元作為潛在的單字邊界。透過組合這些組件,它可以成功匹配單字開頭或結尾的“vis”,而不管周圍的字元如何。
以上是為什麼 Go 的正規表示式 \\b 邊界對於非 ASCII 字元會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!