为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只斗牛犬 2021-12-07 18:33:26
我有一个关于 golang 正则表达式的棘手问题。\b当我像这样放置延迟字符时,边界选项似乎不起作用。我希望它é应该被视为常规字符......但它被视为边界病房之一。package mainimport (    "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?谢谢
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

问题是这\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é"))

}

运行这个给出:


true

true

false

false

此解决方案所做的基本上是替换\b为(?:\A|\z|\s),这意味着“具有以下其中一项的非捕获组:字符串开头、字符串结尾或空格”。您可能想在此处添加其他可能性,例如标点符号。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信