b Go 正規表示式中帶有拉丁字元的邊界
在Go 正規表示式的世界中,b 邊界選項在處理時有一個輕微的怪癖帶有拉丁字符。當嘗試定義包含拉丁字元(例如重音元音和特殊字元)的單字時,就會出現此問題。
考慮以下範例,我們希望使用b 邊界選項來匹配單字「vis」:
<code class="go">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é")) }</code>
令人驚訝的是,將「révisé」配對為false 的預期結果並沒有出現。相反,它匹配為 true。這是因為 b 僅在 ASCII 單字邊界上運行。
為了解決此問題並準確匹配拉丁字符,我們可以用更具包容性的替代方案替換 b 邊界。以下是一個範例:
<code class="go">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é")) }</code>
透過此修改,正規表示式現在使用字串開頭(A)、字串結尾(z) 和空格(s) 的組合來識別單字的開頭和結尾。結果準確地將“vis”匹配為 true,將“révisé”匹配為 false:
true true false false
無論是否存在拉丁字符,此技術都可確保準確的單詞匹配。
以上是為什麼 Go 正規表示式 \\b 邊界對於拉丁字元會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!