关于golang正则表达式,我有一个小问题。
似乎\b
boundering选项不起作用
当我把这样的角色放进去的时候。
我希望将é
视为常规字符。
但它被视为一个笨拙的病房。
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
?
谢谢
答案 0 :(得分:4)
问题是\b
仅适用于围绕ASCII字符的边界,如文档中所述:
在ASCII字边界(一边是\ w,另一边是\ W,\ A或\ z)
é
不是ASCII。但是,您可以通过组合其他正则表达式快捷方式来进行自己的\b
替换。这是一个简单的解决方案,可以解决问题中给出的情况,但您可能希望添加更全面的匹配:
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é"))
}
Running this给出:
true
true
false
false
此解决方案的作用基本上是将\b
替换为(?:\A|\z|\s)
,这意味着"非捕获组具有以下之一:字符串开头,字符串结尾或空格&#34 ;。您可能希望在此处添加其他可能性,例如标点符号。