猿问

Golang正则表达式边界与拉丁字符

我有一个关于 golang 正则表达式的棘手问题。\b当我像这样放置延迟字符时,边界选项似乎不起作用。


我希望它é应该被视为常规字符......但它被视为边界病房之一。


package main


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é"))

}

结果是:


true 

false 

true

请给我任何建议,如何处理r.MatchString("révisé")作为false?


谢谢


一只斗牛犬
浏览 147回答 1
1回答

慕森王

问题是这\b仅适用于 ASCII 字符周围的边界,如文档中所述:在 ASCII 字边界处(一侧为 \w,另一侧为 \W、\A 或 \z)并且é不是 ASCII。但是,您可以\b通过组合其他正则表达式快捷方式来进行自己的替换。这是一个简单的解决方案,可以解决问题中给出的情况,但您可能希望添加更彻底的匹配:package mainimport (    "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é"))}运行这个给出:truetruefalsefalse此解决方案所做的基本上是替换\b为(?:\A|\z|\s),这意味着“具有以下其中一项的非捕获组:字符串开头、字符串结尾或空格”。您可能想在此处添加其他可能性,例如标点符号。
随时随地看视频慕课网APP

相关分类

Go
我要回答