具有拉丁字符的 Golang 正则表达式边界

Golang regexp Boundary with Latin Character

我有一个关于 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 的建议?

谢谢

问题是 \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),即 "a non-capturing group with one of the following: start of string, end of string or whitespace"。您可能想在此处添加其他可能性,例如标点符号。