3

我有一个关于 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é")as false

谢谢

4

1 回答 1

5

问题在于,这\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),这意味着“具有以下之一的非捕获组:字符串开头、字符串结尾或空格”。您可能想在此处添加其他可能性,例如标点符号。

于 2016-02-04T05:09:23.093 回答