我有一个关于 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),这意味着“具有以下其中一项的非捕获组:字符串开头、字符串结尾或空格”。您可能想在此处添加其他可能性,例如标点符号。
- 1 回答
- 0 关注
- 146 浏览
添加回答
举报
0/150
提交
取消