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

5

我在使用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 -- 文档中说 在 ASCII 单词边界(\w 在一侧,\W、\A 或 \z 在另一侧)。唯一的选择可能是在正则表达式中显式匹配您认为是单词边界的字符(空格、换行符、句号、字符串结尾等)。 - Herman Schaaf
1个回答

7
问题在于 \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
这个很好用。在结尾包括标点符号看起来像:(?:[[:punct:]]|\s|\z) - Matt Baer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接