我有一个关于 golang 正则表达式的小棘手问题。
似乎 \b
边界选项不起作用
当我像这样放置 latein 字符时。
我希望 é
应该被视为常规字符..
但它被视为边界病房之一。
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
?
谢谢
最佳答案
问题是 \b
仅适用于 ASCII 字符周围的边界,如文档中所述:
at ASCII word boundary (\w on one side and \W, \A, or \z on the other)
é
不是 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)
,这意味着“一个非捕获组与一个以下之一:字符串开头、字符串结尾或空格”。您可能想在此处添加其他可能性,例如标点符号。
关于regex - 具有拉丁字符的 Golang 正则表达式边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35192744/